1

アップデート:

への参照を保存する方法に問題があると思いますABRecordRef。私は現在、配信された値に固執しているだけで、それなど何もしpeoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:identifier:ていませんCFRetain。保持する必要があるかどうかは、ドキュメントからは不明です。


私は iPhone アプリに取り組んでおり、AddressBook および AddressBookUI フレームワークを使用してアドレス帳とやり取りします。を使用して、ABPeoplePickerNavigationController選択するユーザーに連絡先リストを提示し、その結果ABRecordRefをカスタム クラスのインスタンス変数としてキャプチャしています。

これは、最初の使用ではすべて正常に機能しています。ただし、2回目に連絡先から誰かを選択すると (別の人であっても)、私のアプリはEXC_BAD_ACCESSへの呼び出しで爆発しABRecordCopyValueます。ポインターをログに記録していますが、連絡先が選択されるたびに (同じ連絡先が 2 回であっても) 確実に異なります。

この参照の割り当てを解除する方法を理解できません。確かにメモリ リークですが、なぜ 1 回目は正常に動作し、2 回目は正常に動作しないのでしょうか?

実際の呼び出しは次のとおりです。

- (NSString*)displayName {
    return CFBridgingRelease( ABRecordCopyValue( self.contact, kABPersonFirstNameProperty ) );
}

役に立つ場合のデバッグ出力を次に示します。

Printing description of self->_contact:
(ABRecordRef) _contact = 0x1f582dc0

(lldb) expr (CFTypeRef)ABRecordCopyValue(self.contact, kABPersonFirstNameProperty)
error: Execution was interrupted, reason: EXC_BAD_ACCESS (code=1, address=0xd1f57cc1).
The process has been returned to the state before execution.
4

2 に答える 2

0
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker
      shouldContinueAfterSelectingPerson:(ABRecordRef)person
{
    [self displayPerson:person];
    [self dismissViewControllerAnimated:YES completion:nil];

    return NO;
}

あなたはNOを返しますか?

値が存在するかどうかを確認してみてください

すなわち

- (void)displayPerson:(ABRecordRef)person
{
    NSString* companyName = (__bridge_transfer NSString*)ABRecordCopyValue(person, kABPersonOrganizationProperty);
    NSString* name = (__bridge_transfer NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty);
    NSString* display = @"";

    if (companyName) {
        display = companyName;
    } else if (name) {
        display = name;
    } else {
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"No Details For Contact"
                                                            message:@"Please update contact with company and/or first name"
                                                           delegate:nil
                                                  cancelButtonTitle:@"Dismiss"
                                                  otherButtonTitles:nil];
        [alertView show];
    }
}
于 2013-08-07T03:35:35.843 に答える