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