2

我敢肯定,静态分析可能是在这种情况下正确的,但我不明白为什么...Xcode分析器报告泄漏与ARC - 建议如何解决?

下面是一个关于UUID类的代码段:

@interface UUID { 
    CFUUIDRef uuidRef; 
} 
@end 

@implementation UUID 

- (id) initWithString:(NSString*)string { 
    if (string && [NSNull null] != (NSNull*)string) 
     return [self initWithCFUUID:CFUUIDCreateFromString(kCFAllocatorDefault, (__bridge CFStringRef) string)]; 
    else 
     return nil; 
} 

- (id) initWithCFUUID:(CFUUIDRef)uuidRef { 
    if (self = [super init]) { 
     self->uuid = uuidRef; 
    } 
    return self; 
} 
@end 

Xcode中有在第一次初始化中报告了“返回”行中的泄漏。屏幕截图可以找到here

我有桥,bridge_retain和bridge_transfer一个基本的了解,但我相信桥是在这种情况下的正确选择。

如果我的理解是正确的,任何人都可以提出建议,以我是否错误地这样做呢?另外,我将如何去解决这个问题?

问候, 尼克

回答

1

您需要添加dealloc到您的实现,并呼吁CFRelease上uuidRef有:

- (void)dealloc 
{ 
    CFRelease(uuidRef); 
} 
+0

我怕我不明白这一点。如果CFUUIDCreateFromString()函数返回保留计数为+1的对象,那么肯定释放会释放它?如果我将它添加到我的代码中,那么它会崩溃,正如我所期望的那样...? – 2012-03-26 00:17:07

+1

在你的'UUID'类中,'-initWithCFUUID:'方法应该保留'CFUUIDRef'。你也应该重写'-dealloc'并在那里释放'CFUUIDRef'。这只是基本的保留/释放惯例。 – 2012-03-26 00:45:07

+0

@dark_perfect哎呀,我没注意你如何通过它传递给'initWithCFUUID'保持'UUID'对象。在'自> UUID = uuidRef;'线可能应该是'自我> uuidRef = uuidRef;',也假定接口的声明是正确的(没有'uuid'构件那里)。我把我的答案换成了应该工作的东西。 – dasblinkenlight 2012-03-26 01:05:12