您能告诉我哪种方式正确,为什么在非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;
}
答案 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保留计数,但从未与释放或自动释放平衡。