Objective c Xcode Analyzer报告ARC泄漏-如何解决的建议?
我肯定静态分析仪在这种情况下可能是正确的,但我不太明白为什么 下面是UUID类的一段代码: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
@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
遵循“创建”所有权规则。