objective-c - allocWithZone和NSAllocateObject的区别是什么?
迷茫
迷茫 2017-04-21 11:16:58
0
3
405

《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>
迷茫
迷茫

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

répondre à tous(3)
巴扎黑

Voici le code source de la classe NSObject

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

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 ?

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!