我需要手动释放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保留计数,但从未与发布或自动释放进行平衡。