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);
}