2011-10-19 2 views
0

// 공유 주소록의 인스턴스를 가져옵니다. ABAddressBookRef addressBook = ABAddressBookCreate();nsmutablearray 속성이 개체를 유지하지 않는 이유는 무엇입니까?

//get all contacts in addressbook 
CFArrayRef allContacts = ABAddressBookCopyArrayOfAllPeople(addressBook); 
CFIndex numPeople = ABAddressBookGetPersonCount(addressBook); 


self.contacts = [NSMutableArray array]; 

//modify data to be stored in an array 
for (int i = 0; i < numPeople; i++) { 

    AddressBookPerson *person = [[AddressBookPerson alloc] init]; 

    ABRecordRef ref = CFArrayGetValueAtIndex(allContacts, i); 

    NSString *firstName = (NSString *)ABRecordCopyValue(ref, kABPersonFirstNameProperty); 
    NSString *lastName = (NSString *)ABRecordCopyValue(ref, kABPersonLastNameProperty); 

    ABMultiValueRef phoneNumberProperty = ABRecordCopyValue(ref, kABPersonPhoneProperty); 
    NSArray* phoneNumbers = (NSArray*)ABMultiValueCopyArrayOfAllValues(phoneNumberProperty); 
    CFRelease(phoneNumberProperty); 


    NSString *contactFirstLast = [NSString stringWithFormat: @"%@, %@", firstName, lastName]; 

    person.name = contactFirstLast; 
    person.phoneNumbers = phoneNumbers; 

    [self.contacts addObject:person]; 
    //self.contacts = [NSArray arrayWithArray:listOfContacts]; 
    [contactFirstLast release]; 
    [person release]; 

} 

이 속성이 유지되지 않는 이유는 확실하지 않습니다. 나는 다음과 같은 변형을 시도했다 :

self.contacts = [[NSMutableArray alloc] init];

할당되지만 내부에있는 모든 객체는 유지되지 않습니다. 나는 속성이 아닌 다른 배열을 사용했고 객체는 잘 유지되었습니다. 하지만 문제는 값을 포함하는 전역 속성이 필요하다는 것입니다.

업데이트 :

그 문제에 대한 해결책을 발견했다. 나는 분석을 실행하고 심판도 계산했는데, 메모리 누출이없는 지점까지 도달했습니다. 그러나 문제는 남아 있었고 재산의 이름 때문이었습니다.

"연락처"는 "연결을 시작하고 들어오는 연결 요청을 관리하는 데 사용할 수있는 MIDI 네트워크 호스트 집합"에 대한 기본 제공 속성입니다.

나는 나의 재산을 유일한 이름으로 지었고 모든 문제는 사라졌다. 정적 변수에 대한 필요성은 없습니다. 그리고 저는이 변수를 사용하여 내 객체에서 어떤 일이 벌어지고 있는지를 알기 위해 테스트에 사용하고있었습니다. 정적 변수가 작동하는 이유는 그것이 고유하게 명명 되었기 때문입니다.

+0

질문에 대한 답변은 괜찮지 만 다른 사람의 기존 답변의 수정으로 사용하지 마십시오. –

+0

내 사과, 다음 번에 기억할 것입니다. – Toret

답변

2

짧은 대답 : NSMutableArray가 개체를 보유하고 있으며 프로그램 구현에 참조 카운팅에 오류가 있습니다.

모든 컴파일러 경고를 제거한 다음 정적 분석기를 실행하고 해당 문제를 수정하십시오.

( 프로그램에서 참조 카운트 오류를 ​​지적해야 정적 분석기 )

업데이트

정적 분석을 보여줍니다

contactFirstLast << over-release 
allContacts << leaked 
firstName << leaked 
lastName << leaked 
phoneNumbers << leaked 

이 하나의 참조 카운트에 관해서 코드 4 줄당 문제가 있으며, 당신을 도울 수있는 도구가 있습니다. =)

정확하게 카운트를 다시 할 때까지는 사소한 프로그램을 쓸 수 없습니다. 당신은 그것을 아주 잘 알아야합니다, 그것은 자동적입니다.

내가 지적한 5 가지 문제는 실행 중에 발생하는 첫 번째 문제를 해결하지 못할 수도 있지만 프로그램에서 이러한 문제를 모두 해결하면 프로그램에서 많은 활성 버그가 제거됩니다 (대기중인). 발견됨).

+0

이 솔루션을 시도했지만 여전히 동일한 문제가 있습니다. 정적 MutableArray를 만들었지 만 그 값은 그대로 유지되었지만 객체에 액세스하려고했을 때 EXEC_BAD_ACCESS 오류가 발생했습니다. – Toret

+0

이 시나리오에서 정적을 선택하는 이유는 없습니다. – justin

0

내가 알아챈 한 가지.

할당하지 않은 개체를 해제해서는 안됩니다.

[contactFirstLast release]; 

줄을 제거하십시오.

+0

이 줄을 제거했지만 불행히도 문제가 남아 있습니다. – Toret

관련 문제