2013-01-21 28 views
1

我試圖從通訊錄中獲得名字和姓氏和值存儲在一對夫婦的NSString的:peoplePickerNavigationController泄漏

CFStringRef cfName = ABRecordCopyValue(person, kABPersonFirstNameProperty); 
self.stName = (NSString *)cfName; 
CFRelease(cfName); 
CFStringRef cfLastname = ABRecordCopyValue(person, kABPersonLastNameProperty); 
self.stLastname = (NSString *)cfLastname; 
CFRelease(cfLastname); 

的問題是,如果名字或姓氏在聯繫人空,當我釋放CFStringRef應用程序崩潰與EXC_BAD_ACCESS(殭屍?)。 如果我不釋放CFStringRef,我有泄漏。

任何建議表示讚賞。

最大

+0

爲什麼你刪除了自己的答案?這實際上是正確的解決方案。 CFRelease行爲的解釋可以在這裏找到:http://stackoverflow.com/a/1608425/653513 –

回答

0

是,CFRelease會崩潰(halt)如果你傳遞一個NULL說法。

這是全部由sooth提到的here

CFRelease看起來是這樣的:

void CFRelease(CFTypeRef cf) { 
    if (NULL == cf) HALT; //this line will get you 
#if DEPLOYMENT_TARGET_MACOSX || DEPLOYMENT_TARGET_EMBEDDED 
    if (CF_IS_COLLECTABLE(cf)) { 
     if (CFTYPE_IS_OBJC(cf)) { 
      // release the GC-visible reference. 
      auto_zone_release(auto_zone(), (void*)cf); 
     } else { 
      // special-case CF objects for better performance. 
      _CFRelease(cf); 
     } 
     return; 
    } 
#endif 

source

爲此它是你的responcibility檢查,如果你傳遞一個NULL與否。

你在你的(刪除的)答案中是正確的。代碼應該看起來像:

CFStringRef cfName = ABRecordCopyValue(person, kABPersonFirstNameProperty); 
self.stName = (NSString *)cfName; 
if (self.stName) CFRelease(cfName); 
CFStringRef cfLastname = ABRecordCopyValue(person, kABPersonLastNameProperty); 
self.stLastname = (NSString *)cfLastname; 
if (self.stLastname) CFRelease(cfLastname); 

你仍然可能會得到編譯器警告,但此代碼應該工作正常。