使用ARC的iPhone iOS createUUID泄漏内存

时间:2013-03-31 15:50:05

标签: iphone objective-c nsstring automatic-ref-counting uuid

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

    }

2 个答案:

答案 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