209

私の小さな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はそれを禁止しているため、今は行き詰まっています。オブジェクトが死にかけているときに通知を受ける別の方法はありますか?

4

1 に答える 1

422

ARCを使用する場合は、明示的に呼び出さないでください[super dealloc]。コンパイラがARCを処理します(Clang LLVM ARCドキュメントの7.1.2章で説明されています)。

- (void) dealloc
{
    [observer unregisterObject:self];
    // [super dealloc]; //(provided by the compiler)
}
于 2011-09-03T08:59:51.323 に答える