Objective c Xcode Analyzer报告ARC泄漏-如何解决的建议?

Objective c Xcode Analyzer报告ARC泄漏-如何解决的建议?,objective-c,memory-leaks,automatic-ref-counting,static-analysis,Objective C,Memory Leaks,Automatic Ref Counting,Static Analysis,我肯定静态分析仪在这种情况下可能是正确的,但我不太明白为什么 下面是UUID类的一段代码: @interface UUID { CFUUIDRef uuidRef; } @end @implementation UUID - (id) initWithString:(NSString*)string { if (string && [NSNull null] != (NSNull*)string) return [self initWithCF

我肯定静态分析仪在这种情况下可能是正确的,但我不太明白为什么

下面是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在第一次初始化时报告了“返回”线路上的泄漏。可以找到屏幕截图

我对bridge、bridge_retain和bridge_transfer有基本的了解,但我相信bridge在这种情况下是正确的选择

如果我的理解是正确的,有人能告诉我我是否做得不对吗?还有,我将如何着手解决这个问题

问候,,
Nick

您需要将
dealloc
添加到您的实现中,并在
uuidRef
上调用CFRelease:

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

恐怕我不明白。如果CFUUIDCreateFromString()函数返回一个retain计数为+1的对象,那么释放它肯定会释放它吗?如果我将其添加到代码中,那么它就会崩溃,正如我所期望的那样…?在
UUID
类中,您的
-initWithCFUUID:
方法应该保留
CFUUIDRef
。您还应该覆盖
-dealloc
,并在那里释放
CFUUIDRef
。这只是基本的保留/释放约定。@dark\u很好,我没有注意到您是如何通过将
UUID
对象传递给
initWithCFUUID
来保留它的。
self->uuid=uuidRef行可能应该是
self->uuidRef=uuidRef,假设接口的声明是正确的(那里没有
uuid
成员)。我用一些应该有用的东西来代替我的答案。@KurtRevis好吧,我想这是有道理的。我猜我是走捷径,没有正确地保持和释放,而分析仪却在跟踪我。我不明白的一件事是,为什么这没有显示为分析器中的泄漏?这些UUID对象是在整个应用程序中创建(和使用)的,但是探查器没有检测到任何泄漏-请记住,我没有在dealloc方法中调用CFRelease,我不明白为什么?@dark\u perfect我不知道为什么探查器没有将此显示为泄漏:
CFUUID
doc说
CFUUIDCreateFromString
遵循“创建”所有权规则。