本文主要理解OC对象反汇编,以及block常见类型的反汇编
OC反汇编
创建一个Person类,并在main函数中初始化一个Person对象
@interface Person : NSObject
@property(nonatomic, copy) NSString *name;
@property(nonatomic, assign) int age;
+ (instancetype)person;
@end
@implementation Person
+ (instancetype)person{
return [[self alloc] init];
}
@end
<!--main.m中-->
int main(int argc, char * argv[]) {
Person *p = [Person person];
return 0;
}
-
运行,查看其汇编代码
首先作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS开发交流群:130595548,不管你是小白还是大牛都欢迎入驻 ,让我们一起进步,共同发展!(群内会免费提供一些群主收藏的免费学习书籍资料以及整理好的几百道面试题和答案文档!)
1、静态调试
通过adrp+add获取地址,分别读取x0,x1
-
读取x0,读出来是Person:
x 0x100c68eb0
+po 0x0100c68f98
-
读取x1,读取出来是person方法:
x 0x100c68e88
+p (SEL)0x01c019aef5
2、动态调试
通过一步一步执行汇编,来验证x0、x1是否如静态调试的结果一致?
通过调试发现,是一致的,其实这里的x0、x1
就是 objc_msgSend
的隐藏参数(id self,SEL _cmd)
下面我们继续调试汇编
-
点击step into,直接进入
[Person person]
方法(注意:这里不同iOS版本,多看到的汇编代码是有所区别的)-
从这里看到ios13.4系统的alloc、init并不会走objc_msgSend
-
ios11版本中,可以看到objc_msgSend
-