在apple doc singleton:
static MyGizmoClass *sharedGizmoManager = nil;
+ (MyGizmoClass*)sharedManager {
if (sharedGizmoManager == nil) {
sharedGizmoManager = [[super allocWithZone:NULL] init];
}
return sharedGizmoManager;
}
+ (id)allocWithZone:(NSZone *)zone {
return [[self sharedManager] retain];
}
- (id)copyWithZone:(NSZone *)zone {
return self;
}
- (id)retain {
return self;
}
- (NSUInteger)retainCount {
return NSUIntegerMax; //denotes an object that cannot be released
}
- (void)release {
//do nothing
}
- (id)autorelease {
return self;
}
我有一个问题:
+ (id)allocWithZone:(NSZone *)zone {
return [[self sharedManager] retain];
}
保留应该省略,但为什么要保留?
因为return [self sharedManager]
或[[self sharedManager] retain]
相等。
答案 0 :(得分:1)
sharedGizmoManager
由其自己的类拥有,但尝试使用allocWithZone:
创建实例的任何客户端代码都希望拥有返回的引用(这是alloc
的规则/ allocWithZone:
)。 retain
完全相同 - 通过现有实例为调用代码提供(部分)所有权。
客户端代码,因为它有一个拥有引用,需要在某个时刻发送release
,当它使用该对象完成时。如果没有“额外”保留,这实际上会释放对象所拥有的所有权声明,并且该对象可能(不正确地)被解除分配。
在一个句子中,retain
可以使单身实际上管理自己的生命周期,与客户端代码将遵循的规则兼容。