2013-01-21 2 views
1

내가 연락처에서 이름과 성을 얻고있는 NSString의 몇 가지의 값을 저장하기 위해 노력하고있어 : FIRSTNAME 또는 LASTNAME이 연락처에 비어있는 경우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 인수를 전달합니다.

이것은 이미 sbooth here에 의해 언급되었습니다.

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

을 그 때문에 당신이 그것을 NULL 여부를 전달하고 있는지 확인하기 위해 responcibility입니다 :

CFRelease은 다음과 같습니다.

귀하는 (삭제 된) 답변에 맞았습니다. 코드는 다음과 같아야합니다 :

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); 

그래도 컴파일러 경고가 표시 될 수 있지만이 코드는 정상적으로 작동합니다.