【发布时间】:2010-03-09 16:52:47
【问题描述】:
我对这段在创建单例实例时覆盖某些方法的 sn-p 代码(在 CocoaFundamentals 指南中介绍)感到有些困惑。
static id sharedReactor = nil;
+(id)sharedInstance {
if(sharedReactor == nil) sharedReactor = [[super allocWithZone:NULL] init];
return sharedReactor;
}
.
+(id)allocWithZone:(NSZone *)zone {
return[[self sharedInstance] retain];
}
-(id)retain {
return self;
}
在创建单例实例的代码中,+sharedInstance 方法从超类(在我的例子中是 NSObject)调用 [super allocWithZone:NILL]单身人士。
我感到困惑的是保留的使用,特别是看到保留也被覆盖以返回自我。谁能解释一下,能不能不写:
+(id)allocWithZone:(NSZone *)zone {
return [self sharedInstance];
}
-(id)retain {
return self;
}
EDIT_001:
基于 cmets 并阅读网络上的各种帖子,我决定采用以下方法(见下文)我选择采用共享单例方法,如果需要,我可以选择创建第二个或第三个实例.同样在这个阶段,因为我只将单例用于 MVC 的模型部分,用于一个简单的 iPhone 应用程序,所以我决定将线程安全排除在外。我知道它的重要性,并且随着我对 iPhone 编程的熟悉,我可能会改用 +initialize(记住可以调用两次的子类问题)另外我添加了一个 dealloc,首先在单例时记录一条消息被释放,但也可以在不再需要单例时正确清理。
@interface SharedManager : NSObject
+(id)sharedInstance;
@end
@implementation SharedManager
static id myInstance = nil;
+(id)sharedInstance {
if(myInstance == nil) {
myInstance = [[self alloc] init];
}
return myInstance;
}
-(void)dealloc {
NSLog(@"_deal: %@", [self class]);
[super dealloc];
myInstance = nil;
}
@end
在测试中,我发现我在 dealloc 中将静态变量设置为 nil,或者它保持了指向原始对象的指针。我最初对此有点困惑,因为我期望静态的范围是实例,我猜它是类,这是有道理的。
干杯加里
【问题讨论】:
标签: iphone objective-c cocoa