Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 我需要手动释放CFStringRef吗?_Ios_Objective C_Memory Management_Core Foundation - Fatal编程技术网

Ios 我需要手动释放CFStringRef吗?

Ios 我需要手动释放CFStringRef吗?,ios,objective-c,memory-management,core-foundation,Ios,Objective C,Memory Management,Core Foundation,你能告诉我在非弧形世界里哪条路是正确的,为什么 + (NSString *)getUUID { CFUUIDRef theUUID = CFUUIDCreate(NULL); CFStringRef string = CFUUIDCreateString(NULL, theUUID); CFRelease(theUUID); return [(NSString*) string autorelease]; } 或 cfstring确实需要释放。第一种方法是正确的,因为CFString与NSSt

你能告诉我在非弧形世界里哪条路是正确的,为什么

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


cfstring确实需要释放。第一种方法是正确的,因为CFString与NSString一起使用,因此可以像NSString一样安全地自动释放。

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

第一是正确的方法。创建
CFString
,+1 retain count,自动删除并为客户端返回。转换为
NSString
不会影响保留计数


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

其他答案对于手动保留计数是正确的。当你清醒过来时;^)然后切换到ARC,您将无法发送
自动释放
。相反,在ARC下,按以下方式执行:

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

为了平衡由
CFUUIDCreateString
返回的+1保留计数,cfbrigingRelease相当于
CFRelease
,但也返回一个ARC将负责释放的仍然有效的引用。

@Inafziger我大体上肯定同意,但这篇文章使用了正确的相对“+1”表示法(=保留计数不平衡,因为存在“一个太多”保留)。将其称为“引用计数”@lnafziger我用+1@MatthiasBauch每个人都知道我在说什么,这就是代码中提到的。在苹果框架I的背景之外would@lnafziger我的意思是每个人都知道我在说“保留计数”,而不是“引用计数”,我会建议使用NSUUID代替。@ CasdFixman我喜欢你的方式,但唯一的问题是NSuuID被添加到IOS 6的基础。我的应用目标是5.0。因此,我必须使用CFUUIDRIFF。在ARC(或者真的在非弧下),我会这样做:+(NScSt*)uuID{{[nnuuIDuuID] uuiStord],} @ CasdFixman我喜欢你的方式,但是唯一的问题是NSuuID被添加到IOS 6的基础。我的应用目标是5.0。所以我必须回答CFUUIDRef。我以为这是一个非ARC问题?这在ARC之外仍然有效吗?是的,这是一个非ARC问题。我添加这个答案是为了那些发现这个问题并使用ARC的人,因为标题和标签没有提到ARC或MRC。我不知道为什么这被选为公认的答案。
+ (NSString *)getUUID {
    CFUUIDRef theUUID = CFUUIDCreate(NULL);
    CFStringRef string = CFUUIDCreateString(NULL, theUUID);
    CFRelease(theUUID);
    return CFBridgingRelease(string);
}