2013-01-02 1 views
5

내가 주소록 프레임 워크 주위에 일하는 나는 내 응용 프로그램에서 다른 유형의 일부 메모리 누수를 발견 한 경우 :아이폰 OS - 메모리 누수 주소록은

- (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이있는 핵심 기초 방법 중 하나가 소유권을 ARC 개체로 이전해야하거나 CFRelease 번으로 전화해야합니다. 따라서 3 개의 NSString 개체에 대한 소유권을 이전하고 multiRef을 수동으로 릴리스해야합니다.

것은 그들이 같은 것, 당신이 WWDC 2012 - Modern Objective-C (비디오에 대한 서 37 장 35 절)에 따라, 지금은 무대 뒤에서, 비록 이전 기술 __bridging_transfer (선호되는 CFBridgingRelease를 사용해야 아크 소유권을 이전하려면 맡은 일).

어쨌든, 당신의 세 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); 

그런데 정적 분석기를 실행하면 믿을 수 있습니다. 당신을 위해 이것을 지적했을 것입니다. "제품"메뉴에서 "분석"을 선택하거나 시프트 + + -12을 누르십시오.

+0

와우, 정말 고마워! 더 이상 메모리 누수가없고 분석 도구가 놀랍습니다. 나는 거기에 있다는 것을 몰랐습니다! – Yaman