2012-03-07 8 views
2

UIAletViewをクリックすると、次のエラーが表示されます。UIAlertViewがクリックされたときにクラッシュします

alertView:clickedButtonAtIndex:]: message sent to deallocated instance 0x84c7010 

これは私が使用したコードです。

UIAlertView *testAlert = [[ UIAlertView alloc]initWithTitle:messageTitle message:messageBody delegate:self cancelButtonTitle:messageClose otherButtonTitles:messageTryAgain, nil]; 
    testAlert.tag = 2; 
    [testAlert show]; 
    [testAlert release]; 

そして、私はコントロールがデリゲートメソッド、アプリのクラッシュに達する前であっても、UIAlertViewをクリックすると、私は、デリゲートメソッドに

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ 

} 

を持っています。理由は何か。私は間違って何をしていますか?

+1

デリゲートにメモリの問題があるようです。アラートを発表する前にリリースされていますか? –

+0

私はオートリリースを試みました。しかし、それは問題ではないようです。それでも、UIAlertViewが早すぎて解放されているようです。 –

+4

これは 'UIAlertView'とは関係ありません。レスポンダ(自己)は早すぎるものです。 – basvk

答えて

8

これは「解決策の1つのハック」です。
あなたのデリゲートがメモリの問題であることを理解するのに役立ちます。 testAlertは、これは決してエレガントなソリューションであるとselfが早期割り当てを解除されている理由を見つけるために、さらにあなたのアプリをデバッグすることをお勧めする必要があり

// retain self to avoid crash you were experiencing earlier 
UIAlertView *testAlert = [[ UIAlertView alloc]initWithTitle:messageTitle message:messageBody delegate:[self retain] cancelButtonTitle:messageClose otherButtonTitles:messageTryAgain, nil]; 
testAlert.tag = 2; 
[testAlert show]; 
[testAlert release]; 


- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ 
    // release self because you've gotten past the crash 
    [self release]; 
} 

を却下される前に、(この場合はself中)delegeteは何とか解放され

+0

自己がリリースされているかどうかを確認する方法を教えてください。 NSLogは正しいですか? –

+1

@XaviValero alertviewを表示してgdbに "po self"と入力する直前にブレークポイントを置くと、より明確になります。踏み込んだり、 "po self"と入力して、自分が割り当てを解除されたときを確認してください。 NSLog(@ "myClass deallocing")を投げるのは悪い考えではありません。あなたのdeallocメソッドで –

2

私はあなたの.hファイルを表示できますか?

私は推測をハザードがあった場合、あなたはあなたがこのような何か欠落している可能性がありデリゲート

としてUIAlertViewsに対応するために、あなたのクラスを設定するには忘れてしまった:ARC場合

@interface MyClass : UIViewController <UIAlertViewDelegate>

+0

私はそれをしました。 –

+0

まあ、それはショットの価値があったと思います。それは私がいつも忘れていることです。 –

+2

あなたが設定しなかったとしても、それは正常に実行され、コンパイラ警告が発生するだけです。 – jasondinh

1

をUIAlertViewオブジェクトの保持を有効にし、解放する必要はなく、自動的にオブジェクトを解放します。

関連する問題