《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>
巴扎黑2017-04-21 11:18:58
NSObject 클래스 소스코드입니다
으아악싱글톤의 루트 클래스가 nsobject가 아닐 수 있으므로 이 링크를 참조하세요. 따라서 NSAllocateObject를 직접 사용하세요.
NSProxy는 루트 클래스이지만 코코아 아래에 있습니다.
iOS의 루트 클래스는 참고로 루트 클래스인 NSObject입니다.
伊谢尔伦2017-04-21 11:18:58
일부 싱글톤 구현은 +allocWithZone: 메소드를 재정의하고 싱글톤을 직접 반환하기 때문에 이는 Apple 문서에 제공된 구현입니다. 따라서 객체를 생성하려면 NSAllocatObject를 사용해야 합니다
高洛峰2017-04-21 11:18:58
저도 이런 질문을 받았는데, 이제 이런 답을 얻었습니다. UniqueInstance 변수의 복사본은 하나만 있고, 상위 클래스가 먼저 생성되면 하위 클래스인 [Child alloc]이 공유됩니다. 또는 [Child sharedInstance]는 모두 상위 클래스의 인스턴스를 반환합니다. 왜냐하면 Singleton 클래스가 allocWithZone 메서드를 재정의하고 이 메서드가 고유 인스턴스를 반환하기 때문입니다. 모르겠어요, 그렇죠?