iBooksのようなアプリを作っています。画面にはいくつかのものがあり、各アイテムは小さなサムネイルで表されています。ユーザーがiBooksの[編集]ボタンをタップしたときと同じようにアイテムを削除できるようにしたいのですが、Xが表示され、アイテムが削除されます。私はこれらすべてを処理するために委任パターンを使用しているので、ここにいくつかのコードがあります:
// Button is created in CustomView.h class
UIImage *deleteImage = [UIImage imageNamed:@"delete.png"];
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
self.deleteButton = button;
[self.deleteButton setImage:deleteImage forState:UIControlStateNormal];
[self.deleteButton addTarget:self action:@selector(deleteIt) forControlEvents:UIControlEventTouchUpInside];
// Here's what's called when the delete button is pushed
- (IBAction)deleteMap {
[self.customViewDelegate itemWasDeleted:self];
}
// And here's the implementation of that method, in a View Controller
- (void)itemWasDeleted:self:(CustomView*)customView {
// delete domain object
// . . .
[self.collectionOfCustomViews removeObject:customView];
[customView removeFromSuperview];
}
このコードの問題は、不正アクセス例外が発生することです。NSZombie経由では、次のようになります。
* -[UIButton _unhighlight]:割り当て解除されたインスタンス0x5f4a740に送信されたメッセージ
何が起こっているのかというと、ターゲットアクションの実装が呼び出されたときに、デリゲートメソッドで行っているように、ボタンを離すのはまだ安全ではないということです。だから私の質問は、アプリがクラッシュしないようにするためにこれを行うためのより良いアプローチは何ですか?可能な限りクリーンなアプローチを知りたいです。