3

このクラッシュはシミュレーターでのみ発生します。実際のデバイスでは、問題なく動作し、デバッグできます。(したがって、それほど重要ではありませんが、シミュレーターが便利なプレゼンテーションに取り組んでいます。)

- (BOOL)peoplePickerNavigationController:

(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person {


    [self displayPerson:person];

    if ([self respondsToSelector:@selector(dismissViewControllerAnimated:completion:)]){
        [self dismissViewControllerAnimated:YES completion:nil];
    } else {
        [self dismissModalViewControllerAnimated:YES];
    }

    return NO;
}

クラッシュは次のとおりです。

[self dismissViewControllerAnimated:YES completion:nil];

私が見るのは次のとおりです。"Thread 1: EXC_BREAKPOINT (code=EXC_I386_BTP, subcode=0x0)"

デバッグ ウィンドウに特定の出力はありません。ズームビーが有効になっています。ARCをしています。ストーリーボードを使用していますが、次のコードを使用してプログラムで ABPersonPicker を呼び出します。

-(void)showPeoplePickerController
{

    ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];

    picker.peoplePickerDelegate = self;

    if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]) {
        [self presentViewController:picker animated:YES completion:nil];
    } else {
        [self presentModalViewController:picker animated:YES];
    }

    return;
}

私が持っているデバイス (iPod Touch 第 4 世代、iPhone 4 および iPhone 4S) で問題なく動作していることを覚えておいてください。

4

1 に答える 1

4

あなたの問題は、ピッカーへの強い参照を保持していないことです。それを保持する ivar を追加し、デリゲート コールバックで完了したら、メイン キューでディスパッチ ayn ブロックを使用して ivar をゼロにして解放します。(申し訳ありませんが、iPad からこれを入力するコードはありません)

編集: showPeoplePickerController メソッドを見てください。ピッカーを作成し、メソッドを終了すると解放される自動で保存します。自動の代わりに ivar を使用して、ピッカーへの強い参照を維持したいと考えています。

次に、デリゲート コールバックでピッカーを解放したくありません。これはしばしば機能しますが、予期しないときに噛み付くので、デリゲート コールバックが完了した後にこのタイプのオブジェクトを解放する必要があります。実際、私は通常、最初にオブジェクトのデリゲート プロパティを nil に設定し、その後 'picker = nil' で解放できるようにします。ブロック 'picker' は 'self->picker' に変わります。performSelector:afterDelay:0 も使用できます。ブロックが好きです。

EDIT2:だから私は何をしますか

- (BOOL)peoplePickerNavigationController:shouldContinueAfterSelectingPerson:

NOを返すだけです。このメッセージまで待ちます:

- (void)peoplePickerNavigationControllerDidCancel:

それを却下します。選択したアドレスの保存を確認し、却下するアクションシートをポップする他のコードもありますが、古いコードであり、現在どのように機能するかわかりません。いずれにせよ、これが役立つことを願っています。

于 2012-10-20T12:55:14.097 に答える