Hello World
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.
Quick StartCreate a new post$ hexo new "My New Post"
More info: Writing
Run server$ hexo server
More info: Server
Generate static files$ hexo generate
More info: Generating
Deploy to remote sites$ hexo deploy
More info: Deployment
【iOS重学】Runtime中常用的一些API汇总
写在前面本文主要是总结一下在我们日常项目中会用到的一些关于Runtime的相关API,便于以后查阅。
isMemberOfClass 和 isKindOfClass 区别在正式总结Runtime下相关API之前,先看看isMemberOfClass 和 isKindOfClass的区别:
- (BOOL)isMemberOfClass:(Class)cls;+ (BOOL)isMemberOfClass:(Class)cls;- (BOOL)isKindOfClass:(Class)cls;+ (BOOL)isKindOfClass:(Class)cls;
我们来看一下这几个方法的底层实现:
- (BOOL)isMemberOfClass:(Class)cls { return [self class] == cls;}+ (BOOL)isMemberOfClass:(Class)cls { return self->ISA() == cls;}- (BOOL)isKindOfClass:(Class)cls { ...
【iOS重学】一篇文章讲清楚super
写在前面经常在网上看到[super xxx]这种输出什么内容等类似的面试题,本文就主要来详细剖析一下这种[super xxx]中super调用的底层原理。
场景博主这里用一个常看到的面试题来引出本文的主题:
// Person类@interface Person : NSObject@end @implementation Person@end// Student类@interface Student : Person@end@implementation Student- (instancetype)init { if (self = [super init]) { [super class]; NSLog(@"1 - %@",[self class]); NSLog(@"2 - %@",[super class]); NSLog(@"3 - %@",[self superclass]); NSLog(@"4 - %@ ...
【PS学习】图层相关基本操作
写在前面相关文章:
1、【PS学习】初识PS界面
2、【PS学习】文件基本操作
3、【PS学习】色彩基础
本文主要记录一下图层的一些基本操作,PS版本为【PS2020】。
初识图层图层的显示与隐藏【菜单栏】窗口 - 图层(快捷键F7)
如下:
改变图层缩略图大小选择图层 - 右击 - 改变缩略图大小
如下:
新建的图层默认是透明的,如何想要给当前图层设置颜色,在选择颜色之后填充即可改变图层的颜色。
如何填充?
快捷键:Shift + F5
如下:
如何选择多个图层进行编辑Shift + 需要选择的图层(连续性)
command + 需要选择的图层(非连续性)
如何复制一个图层图层 - 右击 - 复制图层
option + 需要复制的图层 - 拖动
修改图层的名称和颜色图层面板 - 选择图层 - 右键选择颜色(可以用来突出图层)
如下:
复制图层
选择图层 - 右键 - 复制图层
command + J
锁定图层锁定透明像素:锁定之后 画笔工具无法在透明区域进行绘制。
锁定图像像素:锁定之后 无法在该图层上使用画笔工具。
锁定位置:锁定之后 图像的位置就不能移动。
锁定全 ...
【工具使用】Reveal工具的使用介绍
写在前面有时候我们可能想要分析其他APP的一些整体View结构,就像在Xcode分析我们自己的APP一样能够清楚看到个层级结构,Reveal这个APP主要就是这个功能:用来分析APP的层级结构。
RevealReveal APP 官网:https://revealapp.com/
Reveal APP下载地址:https://revealapp.com/download/
这个是官网正版,可以免费试用14天。
Reveal的基本使用
打开Reveal,菜单栏Help - Show Reveal Framework in Finder
真机下的配置
找到RevealServer.framework - ios-arm64 - RevealServer.framework
打开iFunBox - 将RevealServer.framework复制到iFunBox中 Library/Frameworks中
在手机Cydia中搜索Reveal2Loader进行安装
手机设置 - Reveal - Enabled Applications - 选择允许Reveal访问 ...
【iOS重学】方法缓存cache_t的分析
写在前面本文我们主要来分析一下方法缓存cache_t的数据结构是什么样的,苹果是怎么实现方法缓存的。
Class的结构在【iOS重学】窥探Class的结构文中,我们主要分析了Class的结构,结构主要如下:
struct objc_class : objc_object { Class isa; // isa Class superclass; // superclass cache_t cache; // 方法缓存 class_data_bits_t bits; // 具体的类信息}
其中isa、superclass、bits我们都已经讲过了,相关的文章可以参考【iOS重学】详细分析isa和superclass和【iOS重学】class_rw_ext_t结构详解,现在我们就来主要分析一下方法缓存cache_t。
方法缓存cache_t我们都知道查找一个方法的流程大概是:根据isa指针找到类对象,在类对象上找是否有对应的方法,如果没有找到就根据superclass指针找到其父类查看是否有方法实现,以此往上找:
但是如果每次都这么寻找,效率肯定会很低,所以 ...
【iOS逆向】Cycript的基本使用
写在前面本文主要是介绍一下逆向中Cycript的基本用法。
简单介绍Cycript是OC、C++、JS、Java等多种语法的一个混合物,它是用来探索、修改、调试当前正在运行的APP,这个在我们以后逆向的过程中会经常使用到,关于Cycript的更多介绍大家可以参考Cycript官网。
安装Cycript在Cydia里面搜索Cycript进行下载,如下:
Cycript的基本使用Cycript的开启和关闭1、开启
保持Mac和iPhone的安全连接
使用命令cycript -p 进程ID或cycript -p 进程名称
如果不太了解Mac和iPhone怎么保持连接的,可以参考博主的另一篇文章:【iOS逆向】如何让Mac和iPhone建立安全连接。
如下:
这样我们就处于一个Cycript的语法环境。
2、关闭
快捷键:control + D
3、清屏
快捷键:command + R
查看进程的ID和名称在以后逆向中,我们需要使用cycript -p 进程ID或cycript -p 进程名称来探究某个APP,那么这个进程ID和进程名称我们应该从哪里获取呢。
1、在Cydia中搜 ...
【iOS逆向】最全的SSH通信过程
写在前面在【iOS逆向】如何让Mac和iPhone建立安全连接文章中我们主要讲了Mac和iPhone如何建立安全连接,让我们在Mac上可以通过命令来控制iPhone,但是其实我们使用相关登录命令到登录到iPhone中间是有一个过程的,我们本篇文章就是来分析一下这个过程是什么样的,这个过程包括:
建立安全连接
客户端认证
建立安全连接在建立安全连接的过程中,服务器会提供自己的身份证明:公钥信息。
如果客户端并没有保存过服务器的公钥信息,会出现如下提示:
这其实是在问我们是否需要保存这个公钥信息,我们选择【yes】之后保存,在客户端的ssh文件中查看相应的内容:
如果是首次进行该操作,会提示我们输入密码进行登录。
客户端认证SSH提供了两种认证的方式:
1、密码登录的认证方式
2、基于【密钥】的认证方式
SSH会优先使用密钥的认证方式,如果认证失败才会采用密码登录的方式进行认证。
我们这里重点来说一下基于密钥的认证方式是怎么样的。
客户端生成公钥和私钥信息1、通过下面的方式查看客户端是否生成过公钥和密钥:
如果没有生成,通过命令ssh-keygen来生成公钥和私钥信息,如果 ...
【iOS重学】Block底层原理(二)
写在前面在上一篇文章【iOS重学】Block底层原理(一)中我们主要讲了Block的基本使用、底层原理、对变量的捕获机制以及Block的几种类型,本文是第二篇,主要内容包含:
__block修饰符的基本使用
__block修饰的变量在Block内部的底层结构
__block的内存管理
循环引用
__Block的基本使用如果想在Block内部修改auto变量的值,我们一般是无法直接修改的,会报如下错误:
__block修饰符就是用来解决Block内部无法修改auto变量值的问题。
__block不能用来修饰全局变量、static变量。
__block修饰的变量底层结构探究__block int age = 10;void(^Block)(void) = ^{ NSLog(@"age is %d",age);};Block();
如上,使用__block修饰的变量在Block内部之后的底层结构是什么样的呢?跟之前对比有什么不一样。
不使用__block修饰符,Block底层结构如下:
使用__block修饰符,Block底层结构如 ...
【iOS重学】Block底层原理(一)
写在前面关于Block的底层原理相关东西,需要了解的东西比较多,所以博主这里打算用两篇文章来详细分析一下OC里面的Block,这是第一篇,内容主要包含:
Block的基本使用
Block的底层数据结构
Block对变量的捕获
Block的类型
好了,废话少说,现在跟着博主开始从头了解Block吧。
Block的基本使用// 定义一个Blockvoid(^WWBlock)(void) = ^{ NSLog(@"This is a block...");}; // 调用BlockWWBlock();
以上是最简单的一个Block,调用Block()会打印:This is a block...。
// Person 类@interface Person : NSObject- (void)fetchDataWithSuccess:(void(^)(NSString *message))successBlock;@end@implementation Person- (void)fetchDataWithSuccess:(voi ...