OC底层原理(alloc和init篇)

OC对象,每天都在用,用一句话概括,它可能是最熟悉的陌生人。如果让你谈谈你对OC对象的认知,咱们应该如何入手呢?今儿,咱们来个抽骨扒筋,从根本上来对OC对象进行深入的全面的剖析。

研究OC的对象,需要找一个合适的切入点,如果上来就从ISA指针开始讲的话,可能会觉得有些突兀,那么咱们就以对象最最常用的方法alloc和init方法来作为切入点开始研究。来看下面的代码:

 1   - (void)initObjects{
 2       Person *person1 = [Person alloc];
 3       Person *person2 = [person1 init];
 4       Person *person3 = [person1 init];
 5       NSlog("%@ %p %p",person1,person1,&person1);
 6       NSlog("%@ %p %p",person2,person2,&person2);
 7       NSlog("%@ %p %p",person3,person3,&person2);
 8   }
复制代码

Person是继承自NSobject的一个类,然后person1是Person类的对象,person2 和 person3 是 person1 init之后的对象。那么,纵向的来看打印信息中每列的值是否一样呢?来看打印结果:

<Person: 0x100616610>    0x100616610    0x7ffeefbff3f8

<Person: 0x100616610>    0x100616610    0x7ffeefbff3f0

<Person: 0x100616610>    0x100616610    0x7ffeefbff3f0
复制代码

从打印结果中可以看出,第一列和第二列是一样的,第三列是不一样的。这样的结果也非常容易解释,说明person1,person2 和 person3都指向同一个对象,其实来时,第一列和第二列的打印是一样的,都是打印这个对象。而&person,打印的是指针的地址,那指针的地址肯定是不一样。那为啥会出现这样的现象呢?就得从alloc和init方法分别干了什么说起。

alloc

顾名思义,alloc,跟C语言中的malloc是不是有点类似,就是从内存中申请空间,来存放这个对象。我们来继续深入探究一下alloc究竟做了什么。如果我们按住command键跳转到相应的alloc源码中,是无法查看alloc的源码的,所以我们需要在苹果的源码中去寻找,就是下面的网站

opensource.apple.com/tarballs/

我们用的是objc4-787.2.tar.gz这份开源代码,下载下来解压,然后有个xcode工程,打开,就能看到这份源码了。全局搜索+(id)alloc这个方法,就能找到他的实现了。然后经过查看,alloc的调用方法大概就是这样的路径

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享