我需要手动释放CFStringRef吗?

时间:2013-07-31 00:37:33

标签: ios objective-c memory-management core-foundation

您能告诉我哪种方式正确,为什么在非ARC世界。

+ (NSString *)getUUID {
CFUUIDRef theUUID = CFUUIDCreate(NULL);
CFStringRef string = CFUUIDCreateString(NULL, theUUID);
CFRelease(theUUID);
return [(NSString*) string autorelease];
}

+ (NSString *)getUUID {
CFUUIDRef theUUID = CFUUIDCreate(NULL);
CFStringRef string = CFUUIDCreateString(NULL, theUUID);
CFRelease(theUUID);
return (NSString*)string;
}

3 个答案:

答案 0 :(得分:5)

CFStrings确实需要发布。第一种方法是正确的,因为CFString是带有NSString的toll-free bridged,因此可以像NSString一样安全地自动释放。

答案 1 :(得分:5)

其他答案对于手动保留计数是正确的。当你理解时; ^)并切换到ARC,你将无法发送autorelease。相反,在ARC下,这样做:

+ (NSString *)getUUID {
    CFUUIDRef theUUID = CFUUIDCreate(NULL);
    CFStringRef string = CFUUIDCreateString(NULL, theUUID);
    CFRelease(theUUID);
    return CFBridgingRelease(string);
}

为了平衡CFBridgingRelease返回的+1保留计数,CFRelease相当于CFUUIDCreateString,但也会返回ARC将要处理的仍然有效的引用释放。

答案 2 :(得分:2)

您的方法应返回一个自动释放的对象,以便客户端负责获取对象的所有权,如果忽略返回值,它将不会泄漏。

第一是正确的方法。创建CFString,+1保留计数,自动释放并为客户端返回。对NSString的强制转换不会影响保留计数。

在第二种方法中,CFString被创建,+1保留计数,但从未与释放或自动释放平衡。