0

私は次のように開くViewControllerを持っていUIViewControllerますUIViewPicker

-(void)operationClicked:(id)sender {
    ChoseOperationViewController *picker = [[ChoseOperationViewController alloc] initWithNibName:@"ChoseOperationViewController" bundle:[NSBundle mainBundle]];
    [self.view addSubview:picker.view];
    [picker animateSlideOut];
}

UiViewPickerChoseOperationViewControllerは、ペン先を保持するカスタムUiViewControllerクラスです。UINavigationBar

下の写真に示すように、「Anuluj」(キャンセル)ボタンをアクションに接続しました。 ここに画像の説明を入力してください

ボタンをクリックする-[ChoseOperationViewController performSelector:withObject:withObject:]: message sent to deallocated instance 0x7569fd0と、cancelClickedメソッドが呼び出されません。何故ですか?

4

1 に答える 1

0

問題:

-(void)operationClicked:(id)sender {
    ChoseOperationViewController *picker = [[ChoseOperationViewController alloc] initWithNibName:@"ChoseOperationViewController" bundle:[NSBundle mainBundle]];
    [self.view addSubview:picker.view];
    [picker animateSlideOut];
}

これにより、のインスタンスが作成ChoseOperationViewControllerされ、そのビューがサブビューとしてに追加されself.viewます。ただし、メソッド-(void)operationClicked:(id)senderが返されるときは、作成したばかりのインスタンスへの強い参照がないため、ARCはメソッドの割り当てを解除します。

ユーザーがキャンセルボタンをタッチすると、割り当てが解除されたインスタンスにメッセージを送信しようとし、アプリがクラッシュします。

解決:

にインスタンス変数を追加しますUIViewController

@implementation MyViewController {
    ChoseOperationViewController *picker;
}

コードを次のように変更しますoperationClicked

-(void)operationClicked:(id)sender {
    if(!picker) {
         picker = [[ChoseOperationViewController alloc] initWithNibName:@"ChoseOperationViewController" bundle:[NSBundle mainBundle]];
         [self.view addSubview:picker.view];
    }
    [picker animateSlideOut];
}

これにより、ChoseOperationViewControllerインスタンスの割り当てが解除されなくなります

于 2013-03-13T15:37:51.767 に答える