我怎样才能使Xcode anaylzer对类方法报告"存储在'self'中的对象的潜在泄漏"

Joh*_*ers 1 xcode objective-c

我几乎可以肯定我在这段代码中没有泄漏,但Xcode分析器报告存在"潜在"泄漏(Xcode 4.6.1).

+ (MySHA1hash *)sha1HashWithHashBytes:(unsigned char *)hash length:(unsigned int)length;
{
   return [[[MySHA1hash alloc] initWithHashBytes:hash length:length] autorelease];
}
Run Code Online (Sandbox Code Playgroud)

XCode分析器错误截图

如果问题是Xcode报告误报,我想弄清楚如何构建代码以使警告静音.

也有可能我以一种我不理解的方式泄漏,但如果有人能看到我实际上是如何泄漏,我也很乐意得到这些反馈.

这必须与我调用的init函数有关,因为如果我只是用init替换initWithHashBytes,则不再报告泄漏.为此,我还包括initWithHashBytes的主体.

- (id)initWithHashBytes:(unsigned char *)hash length:(unsigned int)length
{
    if (hash != nil && length <= SHA_DIGEST_LENGTH) {
        NSData *data = [NSData dataWithBytes:hash length:length];
        self = [self initWithHash:data];
    }
    else {
        self = nil;
    }
    return self;
}

- (id)initWithHash:(NSData *)hash
{
    if ([hash length] <= SHA_DIGEST_LENGTH && (self = [super init]) != nil) {
        finished = YES;
        [hash getBytes:sha_Result];
        hashValue = [NSNumber numberWithInt:[hash hash]];
    }
    else {
        self = nil;
    }
    return self;
}
Run Code Online (Sandbox Code Playgroud)

Sea*_*ell 6

这条线

self = nil;
Run Code Online (Sandbox Code Playgroud)

initWithHashBytes:(和initWithHash:)是问题.您分配一个对象,但如果返回nilinitWithHashBytes:,该对象会被泄露,因为你会打电话给autoreleasenil,而不是你分配的对象.

self在你回来之前释放nil,一切都应该是好的.