私の小さなiPadアプリには、オブザーバーを使用する「言語切り替え」機能があります。すべてのView Controllerは、その実行中に自分自身をオブザーバーに登録しviewDidLoad:
ます。
- (void)viewDidLoad
{
[super viewDidLoad];
[observer registerObject:self];
}
ユーザーが[言語を変更]ボタンを押すと、新しい言語がモデルに保存され、オブザーバーに通知さupdateUi:
れ、登録されたオブジェクトのセレクターを呼び出します。
これは、TabBarControllerにビューコントローラーがある場合を除いて、非常にうまく機能します。これは、タブバーが読み込まviewDidLoad:
れると、ビューを初期化せずに子コントローラーからタブアイコンをフェッチするため、呼び出されないため、これらのビューコントローラーは言語変更通知を受信しないためです。このため、registerObject:
呼び出しをinit
メソッドに移動しました。
以前viewDidLoad:
はオブザーバーに登録していたとき、以前viewDidUnload:
は登録解除していました。現在で登録しているのでinit
、で登録を解除することは非常に理にかなっていdealloc
ます。
しかし、これが私の問題です。私が書くとき:
- (void) dealloc
{
[observer unregisterObject:self];
[super dealloc];
}
私はこのエラーを受け取ります:
ARCは「dealloc」の明示的なメッセージ送信を禁止します
[super dealloc]
スーパークラスが適切にクリーンアップされるように呼び出す必要があるので、ARCはそれを禁止しているので、今は行き詰まっています。オブジェクトが死んでいるときに通知を受ける別の方法はありますか?