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