2009-07-01 53 views
0

我正在使用通知將數據從詳細視圖控制器傳遞到我的應用程序中的rootviewcontroller。該方法工作正常,直到有內存警告。iPhone - 內存警告後發佈兩次通知

通知在任何內存警告後處理兩次。

當用戶在DetailViewController中選擇一行時,我會將數據傳回給rootviewcontroller。 didSelectRowAtIndexPath方法只被調用一次,但通知觀察者被調用兩次!

我應該刪除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

只是假設您的視圖將被加載和卸載多次並相應地進行編碼。 – 2009-07-01 13:37:43

2

正如你所暗示的,如果你訂閱了兩次通知,你將會收到兩次。

很可能你正在重新實例化一個解除分配的對象並重新訂閱通知。

在您訂閱通知的地方設置一個斷點,您很可能會將它打到兩次。

您可以覆蓋訪問者並取消訂閱通知。或者你可以用KVO做到這一點。