iPhone - メモリ警告後に通知が 2 回投稿される
-
21-08-2019 - |
質問
通知を使用して、アプリの詳細ビューコントローラーからルートビューコントローラーにデータを渡します。これらのメソッドは、メモリ警告が発生するまで正常に動作します。
通知はメモリ警告の後に 2 回処理されます。
ユーザーが DetailViewController 内の行を選択すると、データを rootviewcontroller に返します。DidSelectRowAtIndexPath メソッドは 1 回だけ呼び出されますが、通知オブザーバーは 2 回呼び出されます。
DidReceiveMemoryWarning の通知を削除する必要がありますか?それともコードに何か他の問題があるのでしょうか?
関連するコードを投稿する
RootViewControllerのviewDidLoad
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(rowSelected:) name:@"SelectionNotification" object:nil];
DetailViewController の DidSelectRowAtIndexPath
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSMutableDictionary *dictionary = [[[NSMutableDictionary alloc] init] autorelease];
[dictionary setObject:selectedRow forKey:@"row"];
[[NSNotificationCenter defaultCenter] postNotificationName:kSelectionNotificationName object:self userInfo:dictionary];
[[self navigationController] popToRootViewControllerAnimated:YES];
}
助けていただきありがとうございます。
解決
私は iPhone 開発にはまったく慣れていませんが、これまでのところ気づいたことは、メモリ警告の後、didReceiveMemoryWarning メソッドのデフォルトの実装では、ビューが表示されていない場合はビューをアンロードすることです。
あなたの場合、ルートビューコントローラーが表示されないため、アンロードされていると思います。ルート ビュー コントローラーに戻ると、viewDidLoad メソッドが再度呼び出され、ビュー コントローラー インスタンス (それ自体はアンロードされず、ビューのみがアンロードされます) が通知センターに再度登録されます。
解決策は、初期化時に、デフォルトの init メソッドまたは initWithNibName:bundle:
メソッド、または initWithCoder:
方法。
他のヒント
あなたが示唆しているように、通知を 2 回購読すると、通知を 2 回受け取ることになります。
おそらく、割り当て解除されたオブジェクトを再インスタンス化し、通知を再サブスクライブしていると考えられます。
通知を購読するブレークポイントを設定すると、おそらく 2 回ヒットすることになります。
アクセサーをオーバーライドして、そこで通知のサブスクライブを解除できます。または、KVO を使用して行うこともできます。