《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>
Ini ialah kod sumber Kelas NSObject
Rujuk pautan ini, kerana kelas akar tunggal anda mungkin bukan objek, jadi gunakan NSAllocateObject terus.
NSProxy ialah kelas akar, tetapi ia berada di bawah koko.
Kelas akar di bawah iOS ialah NSObject, iaitu kelas akar, untuk rujukan.
Oleh kerana sesetengah pelaksanaan tunggal akan mengatasi kaedah +allocWithZone: dan terus mengembalikan tunggal, ini adalah pelaksanaan yang diberikan dalam dokumentasi Apple. Jadi anda perlu menggunakan NSAllocatObject untuk mencipta objek
Saya juga mempunyai soalan ini, dan kini saya mempunyai jawapan ini Hanya terdapat satu salinan pembolehubah uniqueInstance, dan subkelas dikongsi dengan kelas induk Jika kelas induk dibuat dahulu, subkelas [Peruntukan kanak-kanak]. atau [Child sharedInstance] kedua-duanya akan mengembalikan Ia adalah contoh kelas induk, kerana kelas Singleton mengatasi kaedah allocWithZone, dan kaedah ini mengembalikan uniqueInstance. Saya tidak tahu, bukan?