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的调用方法大概就是这样的路径