アプリにこのシングルトン コードがあり、時々更新します。私は 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
Clang は、allocWithZone 実装の戻り行について次の警告を出しています。
Object with a +0 retain count returned to caller where a +1 (owning) retain count is expected
保持を上書きしているため、それが得られると思います。clang と参照コードのどちらが正しいと思いますか? メッセージを抑制するようにコードを変更し (たとえば、retain の上書きを避ける)、それを忘れるべきですか?