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

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

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

全員に返信(3)
巴扎黑

これはNSObjectクラスのソースコードです

リーリー

このリンクを参照してください。シングルトンのルートクラスは nsobject ではない可能性があるため、NSAllocateObject を直接使用してください。

NSProxy はルートクラスですが、cocoa の下にあります。

参考までに、iOS のルート クラスはルート クラスである NSObject です。

いいねを押す +0
伊谢尔伦

一部のシングルトン実装は +allocWithZone: メソッドをオーバーライドしてシングルトンを直接返すため、これは Apple のドキュメントに記載されている実装です。したがって、オブジェクトを作成するには NSAllocatObject を使用する必要があります

いいねを押す +0
小葫芦

私もこの質問をしましたが、現在、この答えが得られています。 uniqueInstance 変数のコピーは 1 つだけあり、親クラスが最初に作成された場合、サブクラスは [Child alloc] または [ Singleton クラスは allocWithZone メソッドをオーバーライドし、このメソッドは uniqueInstance を返すため、子 [sharedInstance] は親クラスのインスタンスを返します。分からないですよね?

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!