我在一个应用程序中有这个单例代码,我会不时地进行更新。虽然我采用了苹果的参考代码,但由于clang发出警告并且苹果做出了响应而不得不更新一两次。今天我尝试使用Xcode 4.6进行分析,我又收到了警告,尽管苹果已经两年没有更新了。 我真的无法理解他们为什么不能以一种静态分析器不会抱怨的方式编写单例。如果他们觉得他们的参考代码是正确的话,他们也不必改变静态分析器来适应他们的代码。 但回到代码,我有这个类:
@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
据我所知,这正是来自https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/CocoaObjects.html的参考资料。
Clang对allocWithZone实现的返回行发出警告:
Object with a +0 retain count returned to caller where a +1 (owning) retain count is expected
我认为我们之所以得到这个结果是因为我们覆盖了 retain。你认为谁是正确的,Clang 还是参考代码?我应该只是改变代码来消除这个消息(例如避免覆盖 retain)并忘记它吗?