码迷,mamicode.com
首页 > 其他好文 > 详细

NSArray,NSMutableArray

时间:2017-04-01 15:45:23      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:ini   子类   ssi   介绍   xxx   class   object   创建   mutable   

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

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

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

当我们创建一个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对象.

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

 

NSArray,NSMutableArray

标签:ini   子类   ssi   介绍   xxx   class   object   创建   mutable   

原文地址:http://www.cnblogs.com/VzhanggengD/p/6655707.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!