《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>
Voici le code source de la classe NSObject
Référez-vous à ce lien, car la classe racine de votre singleton n'est peut-être pas nsobject, utilisez donc NSAllocateObject directement.
NSProxy est la classe racine, mais elle est sous cacao.
La classe racine sous iOS est NSObject, qui est la classe racine, pour référence.
Étant donné que certaines implémentations de singleton remplaceront la méthode +allocWithZone: et renverront directement le singleton, il s'agit de l'implémentation donnée dans la documentation d'Apple. Vous devez donc utiliser NSAllocatObject pour créer l'objet
J'avais aussi cette question, et maintenant j'ai cette réponse. Il n'y a qu'une seule copie de la variable uniqueInstance, et la sous-classe est partagée avec la classe parent si la classe parent est créée en premier, la sous-classe [Child alloc]. ou [Child sharedInstance] renverront tous deux C'est une instance de la classe parent, car la classe Singleton remplace la méthode allocWithZone et cette méthode renvoie une uniqueInstance. Je ne sais pas, n'est-ce pas ?