Rumah  >  Soal Jawab  >  teks badan

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 hari yang lalu390

membalas semua(3)saya akan balas

  • 巴扎黑

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

    Ini ialah kod sumber Kelas NSObject

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

    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.

    balas
    0
  • 伊谢尔伦

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

    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

    balas
    0
  • 高洛峰

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

    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?

    balas
    0
  • Batalbalas