2009-04-11 5 views
5

たとえば、メモリが少なくなると、システムはUIApplicationDidReceiveMemoryWarningNotification通知を送信します。その時点で、アップル社はすべてのドキュメントに書いている。しかし、この通知はどこから来ていますか、どの方法で通知されますか?どこに、どのように私は通知を受けるものを登録するのですか?通知を受け取るためにオブジェクトを登録する場所と方法を教えてください。

答えて

5

すべての通知が集中管理される通知センターに送信されます。この通知について通知を受けたいオブジェクトは、通知を受けたい通知を通知し、通知が発生したときにどのメソッドを呼び出すべきかを通知センターに通知します。

詳細については、Notification programming topics for CocoaNSNotification class referenceをご覧ください。あなたは、通知を受けたいクラスの初期化コード内から

17

は、次のメソッド呼び出しを行います。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleMemoryWarning:) name: UIApplicationDidReceiveMemoryWarningNotification object:nil]; 

これは、次のようにあなたのクラスはまたhandleMemoryWarningメソッドを実装することを前提としています

- (void) handleMemoryWarning:(NSNotification *)notification 
{ 
} 
+4

そのクラスのdeallocでremoveObserverを呼び出すことを忘れないでください。 – Abizern

+0

編集できません。セレクタは@セレクタ(handleMemoryWarning :) – DougW

+0

私は最初にコードタグを使用することを怠っている必要があります - 固定。 – m4rkk

5

アプリケーションデリゲートを使用し、オプションのメソッドを実装する方がはるかに簡単です

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application 

最も一般的な通知は、デリゲートへのコールに変換されます。通常は、正式なプロトコルのオプションのメソッドに変換されます。あなたのデリゲートは好きなオブジェクトにすることができます。

+0

通知の名前を取得し、最初から 'UI'を削除し、最後から' Notification'を取り除き、最初の文字をダウンケーシングすることにより、デリゲート名を取得する方法に注意してください。 – Abizern

0

セレクタが通知を引数として受け取る必要があることに注意してください。

@selector(handleMemoryWarning)と - (void)handleMemoryWarning {}のようなものを使用すると、オブジェクトは通知を送信せず、あなたのすべてのメモリを保持します。

私はちょうどこれに噛まれました。

+1

完全に真実ではありません(私はそれも試しました)。パラメタなしで、またはパラメータでセレクタを使用することができます。また、iOSシミュレータの "hardware - > simulate memory warning"を使用してください。 –

+0

本当ですか?すべてのデバイスやOSのバージョンでテストしましたか?私はこのことがテストの際に私のコードで直接起こることを目撃しました。 –

+0

こんにちはベン、私はあなたがいくつかのデバイスとOSバージョンでそれを見たことを疑うことはありません。つまり、私は 'performSelector'がparamについて気にすることは決して見たことがありませんでした。それがどんなデバイスとOSバージョンだったのか –

関連する問題