Frage

Es gibt einen sehr seltsamen Fehler mit meinem Code. Tatsächlich gibt es überhaupt keine Fehler, nur Debugger startet mit "Programm empfangenes Signal:" exc_bad_access "". Kann mir jemand helfen? Ich bin absolut verwirrt ... danke.

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

Konsolenausgabe ist:

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) 

Drücken Sie die weiteren Ausgaben "exc_bad_access" ausgaben. Xcode zeigt, dass die neueste ausgeführte Zeichenfolge in meinem Code war CFRelease(addressBookRef);

War es hilfreich?

Lösung

Ich hatte das gleiche Problem, das etwas Ähnliches machte, und als ich weiter recherchierte, stellte ich fest, dass ich über die Freigabe ging. Laut dem Core Foundation Docs:

Wenn Sie ein Core Foundation -Objekt erstellen oder kopieren, müssen Sie es anschließend veröffentlichen, wenn Sie damit fertig sind.

Ich habe gelesen, dass die Funktionen mit dem Wort Get nicht von Ihnen veröffentlicht werden sollten. Wenn Sie dies tun, wird dies später ein Problem verursachen, wenn der wahre Eigentümer versucht, es zu veröffentlichen. Also in diesem Fall, wenn Sie es tun:

ABRecordRef recordRef = CFArrayGetValueAtIndex(allPeopleRef, i);

und später:

CFRelease(recordRef);

Sie veröffentlichen etwas, das nicht veröffentlicht werden soll. Viel später, wenn Sie es tun:

CFRelease(allPeopleRef);

Das Array wird versuchen, alle Platten zu veröffentlichen, ohne zu wissen, dass Sie bereits einige davon veröffentlicht haben. Das Ergebnis ist Ihr Fehler. Indem Sie diese Zeile aussprechen, haben Sie den Fehler vielleicht verschwinden, aber ich befürchte, dass Sie ein Speicherleck erstellt haben.

Ich schlage vor, Sie rufen nicht an CFRelease an Erhalten Methodenzeiger und rufen Sie es an Schaffen oder Kopieren Methodenzeiger (es kann Ausnahmen von dieser Regel geben, aber bisher funktioniert es für mich).

Andere Tipps

Allpeopleref und AddressBookref zeigen auf dieselben Objekte? Die Kopie ist wahrscheinlich flach. Was macht AbaddressbookCopyArrayoFallpeople?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top