我在一个应用程序中有这个单例代码,我不时更新它。当我获取 Apple 参考代码时,我不得不更新一两次,因为 clang 抱怨并且 Apple 更新了它作为回应。今天我尝试使用 Xcode 4.6 进行分析,但我再次收到警告,尽管 Apple 已经两年没有更新了。我真的无法理解他们如何无法以静态分析器不会抱怨的方式对单例进行编码。如果他们认为他们的参考代码是正确的,他们并不是不能改变静态分析器来适应他们的代码。但回到代码,我有这个类:
@implementation MySingleton
static MySingleton *sSharedSingleton = nil;
+ (MySingleton *)sharedSingleton
{
if (sSharedSingleton == nil)
{
sSharedSingleton = [[super allocWithZone:NULL] init];
}
return sSharedSingleton;
}
+ (id)allocWithZone:(NSZone *)zone
{
return [[self sharedSingleton] retain];
}
- (id)copyWithZone:(NSZone *)zone
{
return self;
}
- (id)retain
{
return self;
}
- (unsigned)retainCount
{
return NSUIntegerMax; //denotes an object that cannot be released
}
- (oneway void)release
{
//do nothing
}
- (id)autorelease
{
return self;
}
@end
Clang 抱怨 allocWithZone 实现的返回行并带有警告:
Object with a +0 retain count returned to caller where a +1 (owning) retain count is expected
我认为我们得到了这一点,因为我们正在覆盖保留。你认为谁是正确的,clang 还是参考代码?我应该只是更改代码以抑制消息(例如避免覆盖保留)并忘记它吗?