NSNotificationCenter postNotificationName exec_badaccess

时间:2013-04-14 02:33:16

标签: iphone uiview viewcontroller nsnotificationcenter

我有一个视图控制器,当它完成时,我发布了一个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,仍然是糟糕的访问。我在另一个新项目中创建了类似的情况,它工作正常。

2 个答案:

答案 0 :(得分:7)

我没有意识到您正在处理UIView而不是UIViewController(应该更好地阅读您的问题)。我认为正在发生的事情是View即使在发布后也会收到通知。请务必致电dealloc中的UIView并以观察员身份删除自己:

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

另外,在NSLog的{​​{1}}方法中添加UIView以查看是否多次调用它。

这个问题非常相似:

ios notifications to "dead" objects

答案 1 :(得分:1)

不确定这是否是原因,但是当您将视图添加到通知中心时,您的选择器是错误的:

selector:@selector(didSelectedBrandId::)

应该只有一个冒号。整行应该是:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didSelectedBrandId:) name:@"SelectedBrandId" object:nil];

两个冒号表示该方法有两个参数,但只需要一个。