Maison  >  Questions et réponses  >  le corps du texte

objective-c - allocWithZone和NSAllocateObject的区别是什么?

《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>
迷茫迷茫2710 Il y a quelques jours389

répondre à tous(3)je répondrai

  • 巴扎黑

    巴扎黑2017-04-21 11:18:58

    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.

    répondre
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-21 11:18:58

    É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

    répondre
    0
  • 高洛峰

    高洛峰2017-04-21 11:18:58

    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 ?

    répondre
    0
  • Annulerrépondre