5

アプリにこのシングルトン コードがあり、時々更新します。私は Apple 参照コードを取得しましたが、clang が文句を言い、Apple がそれに応じて更新したため、1 回か 2 回更新する必要がありました。今日、Xcode 4.6 で解析してみましたが、Apple は 2 年間更新していませんが、再び警告が表示されます。静的アナライザーが文句を言わないような方法でシングルトンをコーディングできない理由が本当に理解できません。また、参照コードが正しいと感じた場合、コードに合わせて静的アナライザーを変更できないわけではありません。コードに戻ると、次のクラスがあります。

@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 と参照コードのどちらが正しいと思いますか? メッセージを抑制するようにコードを変更し (たとえば、retain の上書きを避ける)、それを忘れるべきですか?

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 に答える