iOS九阴真经:一、OC对象的初探

898 阅读2分钟

在探索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);

打印如图:

16367833288050.png

发现 p1,p2,p3 的打印是一样的,而&p1,&p2,&p3的打印是不一样的是的。

原因:

  • alloc 是开辟内存的方法,在 LGPerson 调用 alloc 后赋值给 p1,相当于把 p1 这个变量指向 alloc 开辟好的内存地址,p1 在调用 init 方法后赋值给 p2,p3,初始化的内存还是同一块内存,所以p1,p2,p3 的打印是一样的。

  • &p1,&p2,&p3的地址栈空间上的内存地址,所以打印发现他们的内存地址是不一样且连续的,他们的指向的内存是同一片内存。 用一张图表示:

image.png

二、编译器优化

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;
}

这段代码通过汇编查看:

image.png

可以看到,短短的几行代码生成的汇编却那么多,但这里有个注意点,iOS 默认在 Debug 模式下是没有编译器优化的,需要手动设置:

image.png

设置完成之后,重新编译,断点查看汇编代码:

image.png

发现,汇编代码没那么多了,10 和 20 不见了,方法的调用也没有了,编译器直接给结果 -> 30,这就是编译器优化的结果。的结果。