我在网上找到了一个创建通用唯一标识符(UUID)的方法。 xCode静态分析器告诉我这个方法正在泄漏内存,在下面的代码中标记它。
有人能告诉我编写此代码的正确方法是什么,因此没有内存泄漏?
+(NSString *)createUUID
{
// Create universally unique identifier (object)
CFUUIDRef uuidObject = CFUUIDCreate(kCFAllocatorDefault);
// Get the string representation of CFUUID object.
//leak here
NSString *uuidStr = (__bridge NSString *)CFUUIDCreateString(kCFAllocatorDefault, uuidObject) ;
CFRelease(uuidObject);
return uuidStr;
}
答案 0 :(得分:4)
尝试以下方法:
NSString *uuidStr = (__bridge_transfer NSString *)CFUUIDCreateString(kCFAllocatorDefault, uuidObject);
您需要告诉NSString它负责创建的CFString的所有权。这样,如果打开ARC,CFString将自动释放。如果使用__bridge,则需要显式调用CFRelease来释放由* Create函数调用创建的CFString。
有关__bridge
演员表的详细信息,请阅读Apple Casting and Object Lifetime Semantics指南的Core Foundation Design Concepts部分。
答案 1 :(得分:2)
而不是__bridge
:
NSString *uuidStr = (__bridge NSString *)CFUUIDCreateString(kCFAllocatorDefault, uuidObject) ;
使用CFBridgingRelease
。你在这里使用__bridge
是错误的。您告诉ARC它对uuidStr
没有内存管理职责。但它确实有这样的责任,因为函数Create
的名称为CFUUIDCreateString
。 ARC需要添加与Create
对应的版本。否则你会泄漏。你必须告诉ARC这个。 CFBridgingRelease
是最简单的方法。
有关详情,请参阅我的书中的讨论:
http://www.apeth.com/iOSBook/ch12.html#_memory_management_of_cftyperefs