Domanda

c'è un errore molto strano con il mio codice .. In realtà, non ci sono errori, solo il debugger inizia con " Segnale ricevuto dal programma: “EXC_BAD_ACCESS” " Messaggio. Qualcuno può aiutarmi? Sono assolutamente confuso ... Grazie.

-(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;
}

L'output della console è:

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) 

Premendo Continua le uscite " EXC_BAD_ACCESS " Messaggio. Xcode mostra che l'ultima stringa eseguita nel mio codice era CFRelease(addressBookRef);

È stato utile?

Soluzione

Ho avuto lo stesso problema facendo qualcosa di simile e dopo ulteriori ricerche ho scoperto che stavo rilasciando. Secondo i Documenti della Core Foundation :

  

Se crei o copi un Core   Oggetto di fondazione, è necessario   successivamente rilascialo quando & # 8217; ri   finito con esso.

Ho letto che come significato che funziona con la parola Get non dovrebbe essere rilasciato da te. Se lo fai, causerà un problema in seguito quando il vero proprietario tenta di rilasciarlo. Quindi, in questo caso quando lo fai:

ABRecordRef recordRef = CFArrayGetValueAtIndex(allPeopleRef, i);

e versioni successive:

CFRelease(recordRef);

stai rilasciando qualcosa che non dovrebbe essere rilasciato. Molto più tardi quando lo fai:

CFRelease(allPeopleRef);

l'array tenterà di rilasciare tutti i suoi record senza sapere che ne sono già stati rilasciati alcuni. Il risultato è il tuo errore. Commentando quella riga potresti aver fatto sparire l'errore ma temo che tu abbia creato una perdita di memoria.

Suggerisco di non chiamare CFRelease su Ottieni puntatori del metodo e di chiamarlo su Crea o Copia puntatori al metodo (potrebbero esserci delle eccezioni a questa regola, ma finora funziona per me).

Altri suggerimenti

allPeopleRef e addressBookRef puntano agli stessi oggetti? La copia è probabilmente superficiale. Cosa fa ABAddressBookCopyArrayOfAllPeople?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top