我需要手动释放CFStringRef吗?

你能告诉我哪个是正确的方法,为什么在非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; } 

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

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

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

CFStrings需要被释放。 第一种方法是正确的,因为CFString与NSString是免费桥接的 ,因此可以安全地像NSString那样自动释放。

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

第一个是正确的方法。 CFString创build,+1保留计数,autoreleased并返回给客户端。 转换为NSString不会影响保留计数。

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