我有一个视图控制器,当它完成时,我发布了一个notfication,并且在另一个视图控制器中包含的子视图中添加了一个oberserve。但是,当它试图执行post notificaiton方法时,exec_bad_access会发生。怎么了?代码是:
BrandListByIdViewController.m
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSNumber *bid = self.brands[indexPath.row][@"id"];
[self dismissViewControllerAnimated:YES completion:^{
[[NSNotificationCenter defaultCenter] postNotificationName:@"SelectedBrandId" object:nil];
}];
}
SearchNewProduct.h
@interface SearchNewProduct : UIView
@end
SearchNewProduct.m
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didSelectedBrandId::) name:@"SelectedBrandId" object:nil];
}
}
- (void)didSelectedBrandId:(NSNotification *)notif{
NSLog(@"%s", __PRETTY_FUNCTION__);
}
即使我摆脱了userInfo,仍然是糟糕的访问。我在另一个新项目中创建了类似的情况,它工作正常。
答案 0 :(得分:7)
我没有意识到您正在处理UIView
而不是UIViewController
(应该更好地阅读您的问题)。我认为正在发生的事情是View即使在发布后也会收到通知。请务必致电dealloc
中的UIView
并以观察员身份删除自己:
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
另外,在NSLog
的{{1}}方法中添加UIView
以查看是否多次调用它。
这个问题非常相似:
答案 1 :(得分:1)
不确定这是否是原因,但是当您将视图添加到通知中心时,您的选择器是错误的:
selector:@selector(didSelectedBrandId::)
应该只有一个冒号。整行应该是:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didSelectedBrandId:) name:@"SelectedBrandId" object:nil];
两个冒号表示该方法有两个参数,但只需要一个。