私の小さなiPadアプリには、オブザーバーを使用する「言語切り替え」機能があります。すべてのViewControllerは、その間に自分自身をオブザーバーに登録します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はそれを禁止しているため、今は行き詰まっています。オブジェクトが死にかけているときに通知を受ける別の方法はありますか?