2013-01-02 22 views
5

मैं AddressBook ढांचे के आसपास काम कर रहा था जब मैं बाहर विभिन्न प्रकार के कुछ स्मृति रिसाव अपने आवेदन में मिल गया है:आईओएस - मेमोरी रिसाव AddressBook

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

कोई कार्य करें:

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 

यहाँ मेरी कोड है पता है कि इन लीक के लिए कौन सी लाइनें जिम्मेदार हैं?

उत्तर

5

सामान्य रूप से, किसी भी कोर फाउंडेशन विधि में Copy या Create नाम में या तो आपके एआरसी ऑब्जेक्ट्स को स्वामित्व स्थानांतरित करना चाहिए या आपको CFRelease स्वयं को कॉल करना होगा। इस प्रकार, आपको अपने तीन NSString ऑब्जेक्ट्स के लिए स्वामित्व स्थानांतरित करना चाहिए, और मैन्युअल रूप से multiRef जारी करना चाहिए।

चाप के लिए आप CFBridgingRelease, जो WWDC 2012 - Modern Objective-C (वीडियो में के बारे में 37:35) के अनुसार, अब भले ही पिछले तकनीक, __bridging_transfer (अधिक पसंद किया जाता है पर्दे के पीछे, का उपयोग करना चाहिए स्वामित्व का हस्तांतरण करने के लिए, वे एक ही कर रहे हैं चीज़)।

वैसे भी, अपने तीन NSString वस्तुओं की घोषणाओं होना चाहिए:

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

इस के बराबर है:

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

इसके अलावा, multiRef जारी करने के लिए मत भूलना, भी:

CFRelease(multiRef); 

वैसे, यदि आप स्थैतिक विश्लेषक भागते हैं, तो मुझे विश्वास है आपके लिए इन्हें इंगित किया होगा। "उत्पाद" मेनू से "विश्लेषण करें" चुनें, या शिफ्ट + कमांड + बी दबाएं।

+0

वाह, बहुत बहुत धन्यवाद! कोई और मेमोरी लीक और विश्लेषण उपकरण अद्भुत नहीं है, मुझे नहीं पता था कि यह वहां था! – Yaman

संबंधित मुद्दे