2013-01-02 49 views
5

Ich arbeite um Rahmen Addressbook, als ich habe einigen Speicherverlust von verschiedenen Typen in meiner Anwendung fand heraus:iOS - Speicherleck Address

Leaked Object # Address Size Responsible Library Responsible Frame 
__NSCFArray 8 <multiple> 256 Bytes AddressBook ABCMultiValueInsertAndCreateIdentifier 
__NSCFString 7 <multiple> 224 Bytes AppSupport _sqliteStatementApplyValuesFromRecordWithNullValue 
Malloc 32 Bytes 8 <multiple> 256 Bytes AddressBook ABCMultiValueInsertAndCreateIdentifier 
__NSCFArray 8 <multiple> 256 Bytes AddressBook ABCMultiValueInsertAndCreateIdentifier 
ABCMultiValue 8 <multiple> 256 Bytes AddressBook ABCMultiValueCreate 
Malloc 32 Bytes 7 <multiple> 224 Bytes AddressBook ABCMultiValueInsertAndCreateIdentifier 
__NSCFArray 7 <multiple> 224 Bytes AddressBook ABCMultiValueInsertAndCreateIdentifier 
Malloc 32 Bytes 5 <multiple> 160 Bytes AddressBook ABCMultiValueInsertAndCreateIdentifier 

Hier ist mein Code:

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person { 

    SDAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 

    ABMultiValueRef multiRef = ABRecordCopyValue(person, kABPersonPhoneProperty); 
    NSString *number = (__bridge NSString *) ABMultiValueCopyValueAtIndex(multiRef, 0); 
    NSString *firstname = (__bridge NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty); 
    NSString *lastname = (__bridge NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty); 

    number = (number ? number : @""); 
    firstname = (firstname ? firstname : @""); 
    lastname = (lastname ? lastname : @""); 

    NSDictionary *dic = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:number, firstname, lastname, nil] forKeys:[NSArray arrayWithObjects:kSDPhoneNumberKey, kSDFirstnameKey, kSDLastnameKey, nil]]; 

    NSMutableArray *numberArray = [NSMutableArray arrayWithArray:appDelegate.contactArray]; 
    [numberArray addObject:dic]; 

    [appDelegate setContactArray:numberArray]; 

    [self.tableView reloadData]; 

    [self dismissModalViewControllerAnimated:YES]; 

    return NO; 
} 

jemand tun wissen, welche Linien für diese Lecks verantwortlich sind?

Antwort

5

Im Allgemeinen sollte jede Core Foundation-Methode, die Copy oder Create im Namen hat, entweder Eigentum an Ihre ARC-Objekte übertragen oder Sie müssen CFRelease selbst aufrufen. Daher sollten Sie die Eigentumsrechte für Ihre drei NSString Objekte übertragen und multiRef manuell freigeben.

Eigentum übertragen Sie ARC CFBridgingRelease verwenden sollten, die nach WWDC 2012 - Modern Objective-C (etwa 37:35 in das Video), jetzt gegenüber der vorherigen Technik bevorzugt wird, __bridging_transfer (obwohl, hinter den Kulissen, sie sind die gleichen Ding).

Wie auch immer, die Erklärungen Ihrer drei NSString Objekte sein sollte:

NSString *number = CFBridgingRelease(ABMultiValueCopyValueAtIndex(multiRef, 0)); 
NSString *firstname = CFBridgingRelease(ABRecordCopyValue(person, kABPersonFirstNameProperty)); 
NSString *lastname = CFBridgingRelease(ABRecordCopyValue(person, kABPersonLastNameProperty)); 

Dies entspricht:

NSString *number = (__bridge_transfer NSString *) ABMultiValueCopyValueAtIndex(multiRef, 0); 
NSString *firstname = (__bridge_transfer NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty); 
NSString *lastname = (__bridge_transfer NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty); 

Vergessen Sie auch nicht multiRef zu lösen, auch:

CFRelease(multiRef); 

Übrigens, wenn Sie den statischen Analysator ausgeführt haben, glaube ich es Ich hätte diese auf dich gerichtet. Wählen Sie "Analyze" aus dem "Produkt" -Menü, oder drücken Sie shift + Befehl + B.

+0

Wow, vielen Dank! Keine Speicherlecks mehr und Analyse-Tool ist erstaunlich, ich wusste nicht, dass es da war! – Yaman