5

我在一个应用程序中有这个单例代码,我不时更新它。当我获取 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

据我所知,这正是来自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

我认为我们得到了这一点,因为我们正在覆盖保留。你认为谁是正确的,clang 还是参考代码?我应该只是更改代码以抑制消息(例如避免覆盖保留)并忘记它吗?

4

2 回答 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 并查找自动完成

于 2013-01-30T23:09:05.907 回答
0

你应该忘记它。在某些情况下,人工智能(代码分析器)无法与自然智能竞争。
一个 //@suppress 警告会很好,如果它可以工作

于 2013-01-30T23:28:43.157 回答