2013-04-14 1 views
4

У меня есть контроллер представления, когда он разбирается с завершением, я отправляю уведомление и в подзадаче, содержащемся в другом контроллере представления, добавил как оберегающий. Но, когда он пытается выполнить метод post notificaiton, exec_bad_access происходит. что не так? Коды:NSNotificationCenter postNotificationName exec_badaccess

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, все еще плохой доступ. Я создал аналогичную ситуацию в другом новом проекте, он отлично работает.

ответ

7

Я не знал, что вы имели дело с UIView, а не с UIViewController (должен был лучше прочитать ваш вопрос). Я думаю, что происходит то, что View получает уведомления даже после выхода. Убедитесь в том, чтобы позвонить dealloc в вашем UIView и удалить себя в качестве наблюдателя:

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

Кроме того, положить NSLog в этом UIView «ы initWithFrame метод, чтобы увидеть, если она вызывается более чем один раз.

Этот вопрос очень похож:

ios notifications to "dead" objects

+0

'bid' не должен быть выпущен, потому что он является членом словаря пользовательской информации (который сохраняет свои значения и копирует свои ключи) – dreamlax

+0

Я попытался применить метод postNotificationName до завершения увольнения. Независимо от того, где я помещаю код. В конечном итоге этот диспетчер представлений отклонит. Я попробовал делегата, но, похоже, он не работает. метод делегата не будет выполняться в uiview. –

+0

Изменен мой ответ. Я думал, что вы имеете дело с двумя ViewControllers. Делегат принадлежит к VC. Вы можете использовать метод делегирования и позволить VC, которому принадлежит этот View, обработать его или попробовать исправленный ответ выше. –

1

Не уверен, если это является причиной, но когда вы добавляете ваш взгляд в центр уведомлений, ваш селектор является неправильным:

selector:@selector(didSelectedBrandId::) 

Там должен быть только один двоеточие. Вся строка должна быть:

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

Два двоеточия указывают, что метод принимает два аргумента, но для этого требуется только один.

+0

две колонки опечатка. –