《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>
巴扎黑2017-04-21 11:18:58
這是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,參考。
伊谢尔伦2017-04-21 11:18:58
因為一些單例的實作會覆蓋 +allocWithZone: 方法,直接傳回該單例,蘋果文件中給出的實作就是這樣。所以你要用 NSAllocatObject 來建立物件
高洛峰2017-04-21 11:18:58
我也有此一問,現在有了這個答案,uniqueInstance變數只有一份,並且子類與父類共享,如果先創建了父類,子類[Child alloc]或者[Child sharedInstance]均返回的是父類別的實例,因為Singleton類別重寫了allocWithZone方法,且此方法傳回的是uniqueInstance。不知道對不對?