【问题标题】:release ABMultiValueRef object释放 ABMultiValueRef 对象
【发布时间】:2011-07-15 14:31:17
【问题描述】:

在我的应用中,静态分析器在以下代码中指出了一个漏洞:

ABMultiValueRef phone = (NSString *)ABRecordCopyValue(person,  kABPersonPhoneProperty);
NSString *mobilephone= (NSString*)ABMultiValueCopyValueAtIndex (phone,0);  

类似地,每当我使用此函数 ABRecordCopyValue 时,它​​都会指向泄漏

我尝试通过[phone release]; 方法释放它,但是我收到编译器警告“无效的接收器类型'abmultivalueref'”。释放这个的正确方法是什么?

【问题讨论】:

    标签: iphone memory-management


    【解决方案1】:

    您似乎将NS 数据类型与CF 数据类型混淆了。地址簿方法通常返回核心基础 (CF) 对象。这些对象是免费桥接的,这意味着它们可以与NS 类型互换使用。

    当使用核心基础对象时,任何名称中带有“复制”的方法都将返回一个您稍后需要使用CFRelease 释放的对象。只有将其转换为等效的 NS 才能使用 - release

    所以你的代码可以写成以下任何一种:

    ABMultiValueRef phone = ABRecordCopyValue(person, kABPersonPhoneProperty);
    NSString *mobilephone = (NSString *)ABMultiValueCopyValueAtIndex(phone, 0);
    
    // other code
    
    [mobilephone release];
    

    ABMultiValueRef phone = ABRecordCopyValue(person, kABPersonPhoneProperty);
    CFStringRef mobilephone = ABMultiValueCopyValueAtIndex(phone, 0);
    
    // other code
    
    CFRelease(mobilephone);
    

    【讨论】:

      【解决方案2】:

      你试过CFRelease(phone); 吗?
      因为ABMultiValueCopyValueAtIndex不是NSString,所以是CFStringRef

      【讨论】:

        【解决方案3】:

        使用 __bridge_transfer 可确保 ARC 为您释放对象。 使用__bridge意味着必须手动释放返回的对象。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-11-18
          • 2015-09-25
          • 2012-09-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多