>  Q&A  >  본문

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일 전388

모든 응답(3)나는 대답할 것이다

  • 巴扎黑

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

    NSObject 클래스 소스코드입니다

    으아악

    싱글톤의 루트 클래스가 nsobject가 아닐 수 있으므로 이 링크를 참조하세요. 따라서 NSAllocateObject를 직접 사용하세요.

    NSProxy는 루트 클래스이지만 코코아 아래에 있습니다.

    iOS의 루트 클래스는 참고로 루트 클래스인 NSObject입니다.

    회신하다
    0
  • 伊谢尔伦

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

    일부 싱글톤 구현은 +allocWithZone: 메소드를 재정의하고 싱글톤을 직접 반환하기 때문에 이는 Apple 문서에 제공된 구현입니다. 따라서 객체를 생성하려면 NSAllocatObject를 사용해야 합니다

    회신하다
    0
  • 高洛峰

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

    저도 이런 질문을 받았는데, 이제 이런 답을 얻었습니다. UniqueInstance 변수의 복사본은 하나만 있고, 상위 클래스가 먼저 생성되면 하위 클래스인 [Child alloc]이 공유됩니다. 또는 [Child sharedInstance]는 모두 상위 클래스의 인스턴스를 반환합니다. 왜냐하면 Singleton 클래스가 allocWithZone 메서드를 재정의하고 이 메서드가 고유 인스턴스를 반환하기 때문입니다. 모르겠어요, 그렇죠?

    회신하다
    0
  • 취소회신하다