2012-04-09 15 views
0

Hier ist mein Code, um Notizen von AddressBook zu erhalten.App stürzt ab, wenn Sie Notes von AddressBook erhalten iphone

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

    return ABRecordCopyValue(record, kABPersonNoteProperty); 
} 

Aber in der obigen Implementierung habe ich Speicherleck. Also, um Speicherverlust zu entfernen, schrieb ich folgenden Code

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

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

} 

Wenn ich obigen Code schreibe stürzt meine App ab. Was läuft falsch? Vielen Dank.

UPDATE: Ich diese Methode aufrufen, wie folgt:

notes = [AddreesBook getNote:record]; 

wo Notizen meine Ivar ist & ich es in dealloc Methode bin freigibt.

+0

Was es, wenn es sagt abstürzt ... – EmilioPelaez

Antwort

1

Ihre erste Implementierung verletzt die Eigentumsregel:

Memory Management Rules

das heißt, die API-Aufruf Sie verwenden enthält „Kopieren“, aber du bist es wie ein Autoreleased Objekt zu behandeln.

Vorausgesetzt, dass Sie ein Objekt mit Autorelease in Ihrer überarbeiteten Implementierung zurückgeben, vermute ich, dass Sie Ihre zurückgegebene Zeichenfolge nicht beibehalten. Sie können sicher sagen, ob dies der Fall ist, wenn Ihre App unter einem Debugger unter NSPopAutoreleasePool() abstürzt.

würde Ein einfacher Test -retain auf das Objekt merken Sie zurück zu schicken und sehen, ob der Absturz weggeht:

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

Danke für Info. Ich werde deine Lösung überprüfen. – iOSAppDev

0

Angenommen, der Parameter record ist korrekt festgelegt, sollte Folgendes einen automatisch freigegebenen NSString zurückgeben.

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

aber ich sehe nicht, warum zur Zeit die aktuelle Version von getNote nicht funktioniert.

Verwandte Themen