문제

내 코드에 매우 이상한 오류가 있습니다.실제로 오류가 전혀 없습니다. 단지 디버거가 "프로그램 수신 신호:"EXC_BAD_ACCESS"" 메시지.누구든지 나를 도와줄 수 있나요?정말 혼란스러워요 ...감사합니다.

-(NSString *)fullNameForPhone:(NSString *)ph withAlternativeText:(NSString *)text
{
    ABAddressBookRef addressBookRef = ABAddressBookCreate(); 
    NSLog(@"create addressBookRef");
    NSString *stringToReturn = text;

    CFArrayRef allPeopleRef = ABAddressBookCopyArrayOfAllPeople(addressBookRef);  
    NSLog(@"create allPeopleRef");
    CFIndex nPeople = ABAddressBookGetPersonCount(addressBookRef);  

    int i = 0;
    BOOL nameFound = NO;

    while ((i < nPeople) && (!nameFound))
    {
        ABRecordRef recordRef = CFArrayGetValueAtIndex(allPeopleRef, i);
        NSLog(@"   create recordRef");
        CFStringRef allRecordPhonesRef = ABRecordCopyValue(recordRef, kABPersonPhoneProperty);
        NSLog(@"   create allRecordPhonesRef");
        CFIndex nPhones = ABMultiValueGetCount(allRecordPhonesRef);
        int currentPhone = 0;
        for (currentPhone = 0; currentPhone < nPhones; currentPhone++) 
        {
            CFStringRef currentPhoneNumberRef = ABMultiValueCopyValueAtIndex(allRecordPhonesRef, currentPhone);
            NSLog(@"         create currentPhoneNumberRef");
            NSString *currentCleanPhoneNumber = [self cleanPhoneNumberForString:[NSString stringWithFormat:@"%@", currentPhoneNumberRef]];
            if (currentPhoneNumberRef!=NULL)
            {
                NSLog(@"         release currentPhoneNumberRef");
                CFRelease(currentPhoneNumberRef);
            }

            if ([ph isEqualToString:currentCleanPhoneNumber])
            {
                CFStringRef firstName = ABRecordCopyValue(recordRef, kABPersonFirstNameProperty);
                CFStringRef lastName = ABRecordCopyValue(recordRef, kABPersonLastNameProperty);
                NSString *fullName = [self fullNameForFirstName:[NSString stringWithFormat:@"%@", firstName] 
                                                    andLastName:[NSString stringWithFormat:@"%@", lastName]];
                if (firstName != NULL)
                    CFRelease(firstName);
                if (lastName != NULL)
                    CFRelease(lastName);
                stringToReturn = fullName;
                nameFound = YES;
                break;
            }

        }

        CFRelease(allRecordPhonesRef);
        NSLog(@"   release allRecordPhonesRef");
        CFRelease(recordRef);
        NSLog(@"   release recordRef");
        i++;
    }
    CFRelease(allPeopleRef);
    NSLog(@"release allPeopleRef");
    CFRelease(addressBookRef);
    NSLog(@"release addressBookRef");
    return stringToReturn;
}

콘솔 출력은 다음과 같습니다

2009-07-31 00:20:05.230 abmodular[21747:20b] create addressBookRef
2009-07-31 00:20:05.231 abmodular[21747:20b] create allPeopleRef
2009-07-31 00:20:05.231 abmodular[21747:20b]    create recordRef
2009-07-31 00:20:05.232 abmodular[21747:20b]    create allRecordPhonesRef
2009-07-31 00:20:05.232 abmodular[21747:20b]          create currentPhoneNumberRef
2009-07-31 00:20:05.232 abmodular[21747:20b]          release currentPhoneNumberRef
2009-07-31 00:20:05.232 abmodular[21747:20b]          create currentPhoneNumberRef
2009-07-31 00:20:05.233 abmodular[21747:20b]          release currentPhoneNumberRef
2009-07-31 00:20:05.233 abmodular[21747:20b]    release allRecordPhonesRef
2009-07-31 00:20:05.233 abmodular[21747:20b]    release recordRef
2009-07-31 00:20:05.233 abmodular[21747:20b]    create recordRef
2009-07-31 00:20:05.234 abmodular[21747:20b]    create allRecordPhonesRef
2009-07-31 00:20:05.234 abmodular[21747:20b]          create currentPhoneNumberRef
2009-07-31 00:20:05.234 abmodular[21747:20b]          release currentPhoneNumberRef
2009-07-31 00:20:05.234 abmodular[21747:20b]    release allRecordPhonesRef
2009-07-31 00:20:05.235 abmodular[21747:20b]    release recordRef
2009-07-31 00:20:05.235 abmodular[21747:20b] release allPeopleRef
[Session started at 2009-07-31 00:20:05 +0400.]
GNU gdb 6.3.50-20050815 (Apple version gdb-966)
....
Attaching to process 21747.
kill
quit
The Debugger has exited with status 0.(gdb) 

계속을 누르면 "EXC_BAD_ACCESS" 메시지가 출력됩니다.Xcode는 내 코드에서 가장 최근에 실행된 문자열이 다음과 같다는 것을 보여줍니다. CFRelease(addressBookRef);

도움이 되었습니까?

해결책

나는 비슷한 일을 하면서 같은 문제를 겪었고, 추가 조사를 통해 내가 너무 많이 공개했다는 사실을 발견했습니다.에 따르면 핵심 재단 문서:

코어 파운데이션 객체를 만들거나 복사하면 완료되면 해제해야합니다.

나는 Get이라는 단어가 포함된 기능을 사용자가 공개해서는 안 된다는 의미로 읽었습니다.그렇게 하면 나중에 실제 소유자가 공개하려고 할 때 문제가 발생할 수 있습니다.따라서 이 경우에는 다음을 수행합니다.

ABRecordRef recordRef = CFArrayGetValueAtIndex(allPeopleRef, i);

그리고 나중에:

CFRelease(recordRef);

당신은 공개되어서는 안되는 것을 공개하고 있습니다.훨씬 나중에 다음을 수행할 때:

CFRelease(allPeopleRef);

어레이는 사용자가 이미 레코드 중 일부를 릴리스했다는 사실을 알지 못한 채 모든 레코드를 릴리스하려고 시도합니다.결과는 당신의 실수입니다.해당 줄을 주석 처리하면 오류가 사라질 수 있지만 메모리 누수가 발생할까 걱정됩니다.

전화하지 않는 것이 좋습니다 CFRelease ~에 얻다 메소드 포인터를 호출하고 만들다 또는 복사 메소드 포인터(이 규칙에는 예외가 있을 수 있지만 지금까지는 저에게 효과적입니다).

다른 팁

AllPeopleref 및 judceBookRef는 동일한 개체를 가리십니까? 사본은 아마도 얕습니다. AbaddressbookcopyArrayofalpeople은 무엇을합니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top