2009-07-01 11 views
0

通知を使用して、詳細ビューコントローラからアプリケーションのrootviewcontrollerにデータを渡しています。メモリの警告があるまで、メソッドは正常に動作します。iPhone - メモリ警告後に通知が2回ポストされる

通知はメモリ警告の後に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]; 
} 

感謝。

答えて

2

私はiPhoneの開発に新しくなっていますが、今まで気づいたのは、メモリ警告の後、didReceiveMemoryWarningメソッドのデフォルトの実装は、ビューが表示されていなければアンロードすることです。

あなたのケースでは、ルートビューコントローラが表示されず、そのためにアンロードされていると思います。ルートビューコントローラにポップバックすると、viewDidLoadメソッドが再度呼び出されるため、ビューコントローラインスタンス(アンロードされていないビューのみ)が再度通知センターに登録されます。

解決方法は、初期化時にデフォルトのinitメソッドまたはinitWithNibName:bundle:メソッドまたはinitWithCoder:メソッドのいずれかにある通知センターに登録することです。

+2

あなたのビューは複数回ロードされアンロードされ、それに応じてコードされると仮定します。 –

2

ヒントとして、通知を2回購読すると2回受け取ります。

ほとんどの場合、割り当て解除されたオブジェクトを再インスタンス化して、通知に再登録している可能性があります。

通知を購読する場所にブレークポイントを設定すると、2回ヒットする可能性が高くなります。

アクセサーを無効にしてそこから通知を受け取ることができます。または、KVOで行うこともできます。

関連する問題