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

相關文章
相關標籤/搜索