2

プロジェクトの終わりに近づいていますが、XCode でプロジェクトを分析した後、次の行にメモリ リークがあることが示されています。

http://i.imgur.com/uTkbA.png

関連するコードのテキスト バージョンは次のとおりです。

- (void)displayPerson:(ABRecordRef)person
{
    NSString* firstName = (__bridge_transfer NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty);

    NSString *lastName = (__bridge_transfer NSString*)ABRecordCopyValue(person, kABPersonLastNameProperty);


    NSMutableString *fullName = [NSString stringWithFormat:@"%@ %@", firstName, lastName];

    //NSLog(@"%@", fullName);

    NSString* phoneNum = nil;
    ABMultiValueRef phoneNumbers;
    phoneNumbers = ABRecordCopyValue(person,
                                                     kABPersonPhoneProperty);
    if (ABMultiValueGetCount(phoneNumbers) > 0) {
        phoneNum = (__bridge_transfer NSString*) ABMultiValueCopyValueAtIndex(phoneNumbers, 0);
    } else {
        phoneNum = @"Unknown";
    }

    NSLog(@"First name is %@ and last name is %@", firstName, lastName);
    NSLog(@"Phone is %@", phoneNum);

    phoneNum = [phoneNum stringByReplacingOccurrencesOfString:@"(" withString:@""];
    phoneNum = [phoneNum stringByReplacingOccurrencesOfString:@")" withString:@""];

誰でもこれで私を助けることができますか? それが不自由だとは思いませんが、ストアから私のアプリを拒否する理由を Apple に与えたくありません。ありがとうございました。

ベスト...SL

4

1 に答える 1

4

からの戻り値__bridge_transferを除いて、どこでも使用しています。phoneNumbersABRecordCopyValue

の所有権を ARC に譲渡するphoneNumbersか、メモリを手動で解放する必要があります。

更新:この問題をもう少し詳しく調べたところ、所有権を ARC に譲渡できるかどうかわかりません。詳細については、__bridge_transfer と ABRecordCopyValue: および ARCを参照してください。

追加CFRelease(phoneNumbers)すると、メモリが手動で解放されます。

例えば:

NSString* phoneNum = nil;
ABMultiValueRef phoneNumbers;
phoneNumbers = ABRecordCopyValue(person,
                                                 kABPersonPhoneProperty);
if (ABMultiValueGetCount(phoneNumbers) > 0) {
    phoneNum = (__bridge_transfer NSString*) ABMultiValueCopyValueAtIndex(phoneNumbers, 0);
} else {
    phoneNum = @"Unknown";
}

CFRelease(phoneNumbers);
于 2013-01-15T03:55:13.820 に答える