我正在使用通知将数据从详细视图控制器传递到我的应用程序中的rootviewcontroller。这些方法可以正常工作,直到有内存警告。
在发出任何内存警告后,通知将被处理两次。
当用户在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];
}
感谢您的帮助。
答案 0 :(得分:2)
我对iPhone开发很新,但到目前为止我注意到的是,在内存警告之后,didReceiveMemoryWarning方法的默认实现是卸载视图,如果它不可见。
我认为在您的情况下,根视图控制器不可见,因此卸载。一旦弹回到根视图控制器,将再次调用viewDidLoad方法,因此视图控制器实例(其本身未卸载,只是视图)会再次向通知中心注册。
解决方案是在初始化时在通知中心注册,可以是默认的init方法,也可以是initWithNibName:bundle:
方法,也可以是initWithCoder:
方法。
答案 1 :(得分:2)
正如您所暗示的,如果您订阅了两次通知,您将收到两次。
您很可能正在重新实例化已解除分配的对象并重新订阅该通知。
设置您订阅通知的断点,您很可能会点击两次。
您可以覆盖访问者并取消订阅其中的通知。或者你可以用KVO做到这一点。