在探索OC对象的时候,需要借助apple的objc开源的源码针对性的进行探索,下面是我在进行objc源码编译过程踩的坑点,并且源码已经可以编译。
objc824源码编译地址:www.jianshu.com/p/f830d4cbc…
一、OC对象的指针和内存
LGPerson *p1 = [LGPerson alloc];
LGPerson *p2 = [p1 init];
LGPerson *p3 = [p1 init];
NSLog(@"%@-%p-%p",p1,p1,&p1);
NSLog(@"%@-%p-%p",p2,p2,&p2);
NSLog(@"%@-%p-%p",p3,p3,&p3);
打印如图:
发现 p1,p2,p3 的打印是一样的,而&p1,&p2,&p3的打印是不一样的是的。
原因:
-
alloc 是开辟内存的方法,在 LGPerson 调用 alloc 后赋值给 p1,相当于把 p1 这个变量指向 alloc 开辟好的内存地址,p1 在调用 init 方法后赋值给 p2,p3,初始化的内存还是同一块内存,所以p1,p2,p3 的打印是一样的。
-
&p1,&p2,&p3的地址栈空间上的内存地址,所以打印发现他们的内存地址是不一样且连续的,他们的指向的内存是同一片内存。 用一张图表示:
二、编译器优化
int lgSum(int a, int b){
return a+b;
}
int main(int argc, char * argv[]) {
int a = 10;
int b = 20;
int c = lgSum(a, b);
NSLog(@"查看编译器优化情况:%d",c);
return 0;
}
这段代码通过汇编查看:
可以看到,短短的几行代码生成的汇编却那么多,但这里有个注意点,iOS 默认在 Debug 模式下是没有编译器优化的,需要手动设置:
设置完成之后,重新编译,断点查看汇编代码:
发现,汇编代码没那么多了,10 和 20 不见了,方法的调用也没有了,编译器直接给结果 -> 30,这就是编译器优化的结果。的结果。