0

我正在使用通知将数据从详细视图控制器传递到我的应用程序中的根视图控制器。这些方法工作正常,直到出现内存警告。

在任何内存警告之后,通知会被处理两次。

当用户在 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];
}

谢谢你的帮助。

4

2 回答 2

2

我对 iPhone 开发很陌生,但到目前为止我注意到的是,在内存警告之后,didReceiveMemoryWarning 方法的默认实现是在视图不可见时将其卸载。

我认为在您的情况下,根视图控制器不可见,因此已卸载。一旦你弹回到根视图控制器,再次调用 viewDidLoad 方法,因此视图控制器实例(它本身没有被卸载,只是视图被卸载)再次将自己注册到通知中心。

解决方案是在初始化时在通知中心注册,或者在默认的init方法中,或者在initWithNibName:bundle:方法中,或者在initWithCoder:方法中。

于 2009-07-01T07:56:35.630 回答
2

正如您所暗示的,如果您订阅通知两次,您将收到两次。

您很可能正在重新实例化已释放的对象并重新订阅通知。

在订阅通知的地方设置一个断点,你很可能会点击它两次。

您可以覆盖访问器并取消订阅那里的通知。或者你可以用 KVO 来做。

于 2009-07-01T07:59:20.150 回答