2012-04-09 3 views
0

다음은 AddressBook에서 Notes를 가져 오는 코드입니다.주소록에서 Notes를 가져올 때 응용 프로그램이 다운 됨

+(NSString*)getNote:(ABRecordRef)record { 

    return ABRecordCopyValue(record, kABPersonNoteProperty); 
} 

하지만 위의 구현에서 메모리 누출이 있습니다. 그래서 메모리 누수를 제거하기 위해 다음 코드를 작성했습니다.

+(NSString*)getNote:(ABRecordRef)record { 

    NSString *tempNotes = (NSString*)ABRecordCopyValue(record, kABPersonNoteProperty); 
    NSString *notes = [NSString stringWithString:tempNotes]; 
    [tempNotes release]; 
    return notes; 

} 

위 코드를 작성하면 응용 프로그램이 다운됩니다. 뭐가 잘못 됐어? 감사.

UPDATE :

notes = [AddreesBook getNote:record]; 

을 노트 내 바르 & 내가의 dealloc 메소드에서 해제하고 여기서 다음과 같이 나는이 메서드를 호출합니다.

+0

... – EmilioPelaez

답변

1

첫 번째 구현은 소유권 규칙을 위반하는 것입니다.

수정 된 구현에서 자동 반복 객체를 반환한다고 가정하면 반환 된 노트 문자열을 유지하지 않을 것으로 생각됩니다. 디버거에서 실행할 때 앱이 크래시가 NSPopAutoreleasePool() 인 경우이를 알릴 수 있습니다. ?이 충돌 할 때 말을 무엇

NSString *note = [ MyAddressBook getNote: abRecord ]; 

[ note retain ]; 
/* ... use note ... */ 

/* we retained the object, we must also release it when done with it. */ 
[ note release ]; 
+0

감사 정보를 원하시면 : 충돌이 사라질 경우

간단한 테스트는 당신이 돌아 볼 메모 개체에 -retain를 전송하는 것입니다. 나는 당신의 해결책을 점검 할 것입니다. – iOSAppDev

0

record 매개 변수가 올바르게 설정되었다고 가정하면 다음은 자동 변환 된 NSString을 반환해야합니다. getNote의 현재 버전이 작동하지 않는 이유

+ (NSString *)getNote:(ABRecordRef)record { 
    return [(NSString *)ABRecordCopyValue(record, kABPersonNoteProperty) autorelease]; 
} 

그러나, 나는 현재 보이지 않아요. 말을하는 것입니다

Memory Management Rules

이 API를 사용하면 "복사"를 포함 사용하고 부르지 만, 당신은 오토 릴리즈 객체처럼 취급하고 있습니다 :

관련 문제