NSArray,NSMutableArray

 NSLog(@"%@",[NSMutableArray arrayWithObject:@""].class);   __NSArrayM框架

 NSLog(@"%@",@[@"",@""].class); __NSArrayI指针

 NSLog(@"%@",@[].class); __NSArray0code

当咱们建立一个NSArray对象时,实际上获得的是NSArray的子类__NSArrayI对象.一样的,咱们建立NSMutableArray对象,获得的一样是其子类__NSArrayM对象.有趣的是,当咱们建立只有一个对象的NSArray时,获得的是__NSSingleObjectArrayI类对象.
__NSArrayI__NSArrayM,__NSSingleObjectArrayI为框架隐藏的类.对象

经过NSArray和NSMutableArray接口,返回的倒是子类对象,怎么作到的?
先介绍另外一个私有类:__NSPlaceholderArray,和两个此类的全局变量___immutablePlaceholderArray,___mutablePlaceholderArray__NSPlaceholderArray从类命名上看,它只是用来占位的,具体怎么占位法稍后讨论,有个重要特色是,__NSPlaceholderArray实现了和NSArray,NSMutableArray一摸同样的初始化方法,如initWithObjects:count:,initWithCapacity:等.接口

介绍完__NSPlaceholderArray后,这个机制能够总结为如下两个大步骤:
(1).NSArray重写了+ (id)allocWithZone:(struct _NSZone *)zone方法,在方法内部,若是调用类为NSArray则直接返回全局变量___immutablePlaceholderArray,若是调用类为NSMUtableArray则直接返回全局变量___mutablePlaceholderArray
也就是调用[NSArray alloc]或者[NSMUtableArray alloc]获得的仅仅是两个占位指针,类型为__NSPlaceholderArray.
(2).在调用了alloc的基础上,不管是NSArrayNSMutableArray都一定要继续调用某个initXXX方法,而实际上调用的是__NSPlaceholderArrayinitXXX.在这个initXXX方法内部,若是self == ___immutablePlaceholderArray就会从新构造并返回__NSArrayI 对象,若是self == ___mutablePlaceholderArray就会从新构造并返回_NSArrayM对象.ci

总结来讲,对于NSArrayNSMutableArrayalloc时拿到的仅仅是个占位对象,init后才获得真实的子类对象.it

相关文章
相关标签/搜索