1

我在网上找到了一个创建通用唯一标识符 (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;

    }
4

2 回答 2

4

尝试以下操作:

NSString *uuidStr = (__bridge_transfer NSString *)CFUUIDCreateString(kCFAllocatorDefault, uuidObject);

您需要告诉 NSString 它负责创建的 CFString 的所有权。这样,如果您打开了 ARC,CFString 将被自动释放。如果您改用 __bridge,则需要显式调用 CFRelease 以释放由 *Create 函数调用创建的 CFString。

有关转换的更多信息,__bridge请阅读Apple核心基础设计概念指南的转换和对象生命周期语义部分。

于 2013-03-31T16:07:50.363 回答
2

而不是__bridge

NSString *uuidStr = (__bridge NSString *)CFUUIDCreateString(kCFAllocatorDefault, uuidObject) ;

使用CFBridgingRelease. 您对__bridge此处的使用是错误的。您是在告诉 ARC,它对uuidStr. 但它确实有这样的责任,因为Create在功能的名称CFUUIDCreateString。ARC 需要添加一个 release 来对应Create. 否则你会泄漏。你必须告诉 ARC 这件事。CFBridgingRelease是最简单的方法。

有关更多信息,请参阅我书中的讨论:

http://www.aeth.com/iOSBook/ch12.html#_memory_management_of_cftyperefs

于 2013-03-31T16:06:28.473 回答