私はこの問題に数回遭遇しましたが、正しいアプローチを知りたいと思います。
たとえば、iPhoneアプリを作成していて、ブロックを使用するカスタムアラートビュークラスが必要だとします。
だから私はクラスを書き、それから後で私のコードで行きます:
MyAlertView *alert = [MyAlertView alertWithBlahBlahBlah...];
[alert addButton:@"button" withBlock:^{ ... }];
[alert show];
アラートビュークラスのどこかに、
- (void)addButton:(NSString *)button withBlock:(void (^))block {
[_blocks setObject:[block copy] forKey:button];
}
- (void)show {
... drawing stuff ...
UIButton *button = ...
[button addTarget:self selector:@selector(buttonPressed:) ...];
...
}
- (void)buttonPressed:(id)sender {
((void (^)())[_blocks objectForKey:[sender title]])();
}
そのため、アラートビューが正常に表示されるようになりました。問題は、ボタンをタップすると、表示されたオブジェクトにbuttonPressed:
セレクターを送信しようとすることです。MyAlertView
ただし、MyAlertView
現時点では、はスーパービューから削除されています。ARCは、アラートビューはもう誰も所有していないため、ボタンが将来メッセージを送信する必要があることを知らずに、割り当てを解除する必要があると判断しました。これにより、ボタンをタップするとクラッシュが発生します。
アラートビューをメモリに保持する正しい方法は何ですか?オブジェクトをそれを使用しているクラスのプロパティにすることはできMyAlertView
ますが、それはちょっとばかげています(一度に2つのアラートを表示したい場合はどうなりますか?)。