NSNotification приводит к ошибке сегментации - PullRequest
6 голосов
/ 28 июня 2011

У меня странное поведение с объектом NSNotification.
Мое приложение имеет контроллер навигации, первое представление - это представление таблицы, а второе - просто контроллер представления, который показывает данные выбранной ячейки.
Итакв этом контроллере представления данных я посылаю уведомление, когда нажимаю кнопку.Уведомление также работает сначала.

НО, когда я возвращаюсь к табличному представлению и снова помещаю контроллер представления данных в стек и снова касаюсь кнопки с уведомлением, целое приложение вылетает без журнала ошибок.
Xcode выделяет только эту строку:

[[NSNotificationCenter defaultCenter] 
 postNotificationName:@"toggleNoteView" object:nil];

Функция, куда я отправляю уведомление:

- (IBAction) toggleNoteView: (id) sender
{
    [[NSNotificationCenter defaultCenter] 
    postNotificationName:@"toggleNoteView" object:nil];
}

Это получатель:

- (id)init {
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(toggleNoteView:) 
                                             name:@"toggleNoteView" object:nil];
     ...
}

- (void) toggleNoteView:(NSNotification *)notif  {

    takingNotes = !takingNotes;
}

Редактировать: Теперь я получил несколько журналов ошибок.

2011-06-27 23:05:05.957 L3T[3228:707] -[UINavigationItemView toggleNoteView:]: unrecognized selector sent to instance 0x4b235f0
2011-06-27 23:05:06.075 L3T[3228:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UINavigationItemView toggleNoteView:]: unrecognized selector sent to instance 0x4b235f0'
*** Call stack at first throw:
(
0   CoreFoundation                      0x3634f64f __exceptionPreprocess + 114
1   libobjc.A.dylib                     0x370a2c5d objc_exception_throw + 24
2   CoreFoundation                      0x363531bf -[NSObject(NSObject) doesNotRecognizeSelector:] + 102
3   CoreFoundation                      0x36352649 ___forwarding___ + 508
4   CoreFoundation                      0x362c9180 _CF_forwarding_prep_0 + 48
5   Foundation                          0x35c45183 _nsnote_callback + 142
6   CoreFoundation                      0x3631e20f __CFXNotificationPost_old + 402
7   CoreFoundation                      0x362b8eeb _CFXNotificationPostNotification + 118
8   Foundation                          0x35c425d3 -[NSNotificationCenter postNotificationName:object:userInfo:] + 70
9   Foundation                          0x35c441c1 -[NSNotificationCenter postNotificationName:object:] + 24
10  L3T                                 0x0003d17f -[Container toggleNoteView:] + 338
11  CoreFoundation                      0x362bf571 -[NSObject(NSObject) performSelector:withObject:withObject:] + 24

Ответы [ 2 ]

8 голосов
/ 28 июня 2011

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

-(void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [super dealloc];
}
3 голосов
/ 28 июня 2011

Из вашего описания кажется, что каждый раз, когда вы нажимаете контроллер представления, вы создаете новый экземпляр контроллера представления, чтобы сделать это.

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

Затем в методе dealloc этого объекта отмените подписку на уведомления.

-(void)dealloc {
     [[NSNotificationCenter defaultCenter] removeObserver:self];
     //other deallocation code
     [super dealloc];
}
...