Apple单例代码警告......再次

时间:2013-01-30 23:05:01

标签: ios objective-c

我在app中有这个单例代码,我不时更新。当我使用Apple参考代码时,我不得不更新一次或两次,因为clang抱怨并且Apple更新了它作为回应。今天我尝试用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

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

2 个答案:

答案 0 :(得分:4)

这个例子已经过时了,特别是在引入ARC和GCD时,大多数情况下,你只需要这个

+ (DSSingleton *)sharedInstance
{
    static DSSingleton *sharedInstance;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [DSSingleton new];
    });

    return sharedInstance;
}

Xcode为该内部部分提供了很棒的代码片段 - 只需键入dispatch_once并查找自动完成

答案 1 :(得分:0)

你应该忘掉它。在某些情况下,人工智能(代码分析器)无法与自然智能竞争 // @抑制警告如果可行的话会很好