2014-01-05 4 views
1

CFRelease 뒤에 항상 NULL을 지정해야합니까? 다음 코드를 고려하십시오.CFRelease 후에 CFTypeRef를 NULL로 변환하는 것이 더 좋습니다.

personRef는 주소 레이블을 추출하려고하는 ABRecordRef입니다.

ABMultiValueRef addrRef = ABRecordCopyValue(personRef, kABPersonAddressProperty); 
CFStringRef lbl = ABMultiValueCopyLabelAtIndex(addrRef, i); 
if(lbl!=NULL) { 
    //fetch the label and store it in NSString here. 
    //... 
    CFRelease(lbl); 
    lbl=NULL; //Is it a better practice or mandatory to assign lbl to NULL? 
} 

난 아직도 그것은 당신이 나중에 변수에 더 테스트를 수행 하지 않는 한 차이를하지 않습니다

답변

2

:-) 부탁 해요 왜 디버그 창에서 일부 주소 값을 볼 수 있었다 코드 (즉, 변수는 NULL 일 수 있으며, 이는 코드 내에서 유효합니다).

+0

루프 내부에서 사용하면 어떻습니까? 내 말은, 루프의 마지막에 NULL을 설정하면, 차이가 나는 것입니까? – thandasoru

+0

@thandasoru 코드에 따라 다릅니다. 변수가 때때로 'NULL'이고 다른 변수가'NULL '이 아닌 경우, 예, 중요합니다. 그렇지 않으면. – trojanfoe

3

NULL으로 설정하면 그 값을 전달하는 다음 함수가 barf가됩니다.

값을 "유효하지 않을 수 있습니다."여전히 값이 유효하고 이상하게 작동하는 것처럼 보입니다. 결국 그것은 폭발 할 것이고 디버깅하는 것이 훨씬 더 어렵습니다.

당신이 변수가 이전 객체를 해제 한 후 항상 신선한 라이브 객체에 설정되고 다시 변수를 사용하기 전에, 당신이 NULL 할당을 건너 뛸 수을 보장 할 수있는 경우 분석기 월 심지어 그것에 대해 불평한다 (그것은 NULL 할당을 "죽은 가게"라고 부를 것이다).

변수가 이 아니고이 출시와 다음 사용 사이에서 재설정 될 때마다 출시 직후 NULL으로 설정해야합니다. 분석기는 모든 문제가 아닌 일부 문제를 파악할 수 있습니다. 변수를 NULL으로 설정하면 프로그램을 인식하고 디버그 할 수있는 방식으로 프로그램을 충돌시킬 가능성이 커지고 문제의 실제 원인 (예상치 못한 릴리스 또는 작성해야 할 지점)에 가깝게 충돌 할 가능성이 커집니다. 새로운 객체).

의심스러운 경우 NULL으로 설정하십시오. 분석기가 불평하는 경우에만 꺼내십시오. 그리고 심지어 심미적이거나 일관성있는 이유로 분석기의 이의 제기를 남기고 선호하는 경우가 있습니다.

+0

멋진 조언, 감사합니다! – thandasoru