苹果单例代码警告...再次出现

5

我在一个应用程序中有这个单例代码,我会不时地进行更新。虽然我采用了苹果的参考代码,但由于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)并忘记它吗?

2个回答

4
那个例子已经过时了,特别是引入ARC和GCD之后,大多数情况下,你只需要这样做。
+ (DSSingleton *)sharedInstance
{
    static DSSingleton *sharedInstance;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [DSSingleton new];
    });

    return sharedInstance;
}

Xcode内置了很好的代码片段,只需输入dispatch_once并查找自动完成即可。


0

你应该忘记它。有些情况下,人工智能(代码分析器)无法与自然智能竞争。
如果//@suppress warning有效的话,那会很不错。


代码分析器并不是人工智能,至少不是你所暗示的那种意义上的。编写片段的“自然智能”也可以访问代码分析器,而且可能还可以访问正在开发它的团队。因此,在您的术语中,这是自然智能与自然智能之间的较量 ;) - Ecuador

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接