3

您能否告诉我在非 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;
}
4

3 回答 3

5

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

于 2013-07-31T00:45:39.883 回答
5

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

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

ACFBridgingRelease等效于 aCFRelease以平衡由 返回的 +1 保留计数CFUUIDCreateString,但也返回 ARC 将负责释放的仍然有效的引用。

于 2013-07-31T05:11:36.620 回答
2

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

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

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

于 2013-07-31T00:46:05.493 回答