objective-c - allocWithZone和NSAllocateObject的差別是什麼?
迷茫
迷茫 2017-04-21 11:16:58
0
3
434

《Objective-C編程之道》“第7章單例”中提到用NSAllocateObject來分配可以防止子類分配時候得到父類的對象。

但是據我測試沒有任何區別,請知情人士指點。

創建對象代碼
+ (Singleton *)sharedInstance
{
  if (uniqueInstance == nil) {
    uniqueInstance = [[super allocWithZone:nil] init];
//    uniqueInstance = NSAllocateObject([self class], 0, nil);
  }
  return uniqueInstance;
}
測試代碼
id child1 = [[Child alloc] init];
NSLog(@"child1 = %@", child1);
    
id child2 = [[Child alloc] init];
NSLog(@"child2 = %@", child2);
測試結果
2013-03-22 16:59:34.634 Singleton[5107:303] This is Singleton demo.
2013-03-22 16:59:34.636 Singleton[5107:303] child1 = <Child: 0x10010a9b0>
2013-03-22 16:59:34.637 Singleton[5107:303] child2 = <Child: 0x10010a9b0>
迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回覆(3)
巴扎黑

這是NSObject Class源碼

+ (id) allocWithZone:(NSZone*)z
{
  return NSAllocateObject(self, 0, z);
}

參考這個鏈接,因為你的singleton可能root class不是nsobject,所以直接使用NSAllocateObject.

NSProxy就是root class,但它是cocoa下的。

iOS下的root class就是NSObject就是root class,參考。

伊谢尔伦

因為一些單例的實作會覆蓋 +allocWithZone: 方法,直接傳回該單例,蘋果文件中給出的實作就是這樣。所以你要用 NSAllocatObject 來建立物件

小葫芦

我也有此一問,現在有了這個答案,uniqueInstance變數只有一份,並且子類與父類共享,如果先創建了父類,子類[Child alloc]或者[Child sharedInstance]均返回的是父類別的實例,因為Singleton類別重寫了allocWithZone方法,且此方法傳回的是uniqueInstance。不知道對不對?

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板