Objective-C: Где удалить наблюдателя для NSNotification?

У меня объективный класс C. В нем я создал метод инициализации и настроил в нем NSNotification.

//Set up NSNotification
[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(getData)
                                             name:@"Answer Submitted"
                                           object:nil];

Где мне установить [[NSNotificationCenter defaultCenter] removeObserver:self] в этом классе? Я знаю, что для UIViewController я могу добавить его в метод viewDidUnload. Итак, что нужно сделать, если я только что создал целевой класс c?


person Zhen    schedule 24.06.2011    source источник
comment
Ставлю в метод dealloc.   -  person onnoweb    schedule 24.06.2011
comment
Метод dealloc не был автоматически создан для меня, когда я создавал целевой класс c, поэтому я могу добавить его?   -  person Zhen    schedule 24.06.2011
comment
Да, вы можете реализовать -(void)dealloc, а затем добавить в него removeObserser:self. Это наиболее рекомендуемый способ поставить removeObservers:self   -  person petershine    schedule 24.06.2011
comment
Можно ли использовать метод dealloc в iOS 6?   -  person wcochran    schedule 23.05.2013
comment
Да, использование dealloc в проектах ARC допустимо, если вы не вызываете [super dealloc] (вы получите ошибку компилятора, если вызовете [super dealloc]). И да, вы определенно можете поместить свой removeObserver в dealloc.   -  person Phil    schedule 24.05.2013
comment
Dealloc все еще существует, но это не место для этого, ваш dealloc никогда не будет вызван из-за ссылок на ваш объект в центре уведомлений.   -  person mcfedr    schedule 08.10.2013
comment
@mcfedr что вы предлагаете, когда NotificationCenter ссылается на объект?   -  person Shamsiddin    schedule 24.04.2017
comment
@Shamsiddin Этот мой комментарий на самом деле неверен. NotificationCentre не хранит строгих ссылок на объекты.   -  person mcfedr    schedule 25.04.2017


Ответы (13)


Общий ответ будет «как только вам больше не нужны уведомления». Очевидно, это не удовлетворительный ответ.

Я бы рекомендовал вам добавить вызов [notificationCenter removeObserver: self] в метод dealloc тех классов, которые вы собираетесь использовать в качестве наблюдателей, поскольку это последний шанс полностью отменить регистрацию наблюдателя. Однако это защитит вас только от сбоев из-за уведомления центра уведомлений о мертвых объектах. Он не может защитить ваш код от получения уведомлений, когда ваши объекты еще не находятся / больше не находятся в состоянии, в котором они могут правильно обрабатывать уведомление. Для этого ... См. Выше.

Изменить (поскольку ответ, кажется, вызывает больше комментариев, чем я мог подумать) Все, что я пытаюсь сказать, это: действительно сложно дать общий совет относительно того, когда лучше всего удалить наблюдателя из центр уведомлений, потому что это зависит от:

  • В вашем случае использования (какие уведомления наблюдаются? Когда они отправляются?)
  • Реализация наблюдателя (когда он готов получать уведомления? Когда он больше не готов?)
  • Предполагаемое время жизни наблюдателя (привязано ли оно к какому-то другому объекту, скажем, представлению или контроллеру представления?)
  • ...

Итак, лучший общий совет, который я могу дать: защитите свое приложение. против хотя бы одного возможного отказа, сделайте removeObserver: танец в dealloc, поскольку это последний момент (в жизни объекта), где вы можете сделать это чисто. Это не означает: «просто отложите удаление до вызова dealloc, и все будет хорошо». Вместо этого удалите наблюдателя , как только объект больше не будет готов (или не требуется) для получения уведомлений. Это как раз подходящий момент. К сожалению, не зная ответов ни на один из упомянутых выше вопросов, я даже не могу предположить, когда это произойдет.

Вы всегда можете безопасно removeObserver: использовать объект несколько раз (и все вызовы данного наблюдателя, кроме самого первого, будут nops). Итак: подумайте о том, чтобы сделать это (снова) в dealloc, чтобы быть уверенным, но прежде всего: сделайте это в подходящий момент (который определяется вашим вариантом использования).

person Dirk    schedule 24.06.2011
comment
Это небезопасно с ARC и потенциально может вызвать утечку. См. Это обсуждение: cocoabuilder.com/archive/cocoa/311831- arc-and-dealloc.html - person MobileMon; 27.06.2013
comment
@MobileMon Статья, на которую вы ссылаетесь, похоже, подтверждает мою точку зрения. Что мне не хватает? - person Dirk; 28.06.2013
comment
Я полагаю, это следует отметить в том, что нужно удалить наблюдателя где-то еще, а не в dealloc. Например, вид исчезнет - person MobileMon; 01.07.2013
comment
@MobileMon - да. Я надеюсь, что это то, о чем я говорю со своим ответом. Удаление наблюдателя в dealloc - это только последняя линия защиты от сбоя приложения из-за более позднего доступа к удаленному объекту. Но подходящее место для отмены регистрации наблюдателя обычно находится в другом месте (и часто гораздо раньше в жизненном цикле объекта). Я не пытаюсь сказать здесь: «Эй, просто сделай это в dealloc, и все будет хорошо». - person Dirk; 01.07.2013
comment
@MobileMon Например, viewWillDisappear Проблема с конкретным советом состоит в том, что это действительно зависит от того, какой тип объекта вы регистрируете в качестве наблюдателя для какого типа события. Может отменить регистрацию наблюдателя в viewWillDisappear (или viewDidUnload) для UIViewControllers, но это действительно зависит от варианта использования. - person Dirk; 01.07.2013
comment
Да, я думаю, я неправильно понял твой ответ. Я полагаю, что хотел указать это в ответе ниже, извините за это - person MobileMon; 01.07.2013
comment
ARC запрещает явные вызовы функции dealloc, например [super dealloc]. Это не работает для iOS 6. - person quantumpotato; 13.09.2013
comment
Это вызовет утечки! Dealloc никогда не будет вызван, потому что notificationCenter все еще хранит ссылки на ваш объект. - person mcfedr; 08.10.2013
comment
@mcfedr: нет, NSNotificationCenter не сохраняет объекты, добавленные с помощью addObserver:selector:name:object:. Он не указывает это явно в документации, но вы можете вывести это из предложений, таких как Обязательно вызовите removeObserver: или removeObserver: name: object: перед notificationObserver или любым объектом, указанным в addObserver: selector: name: object: будет освобожден. (или вы можете запустить небольшую тестовую программу и проверить поведение, как я только что сделал для уверенности). - person Dirk; 08.10.2013
comment
@lekksi - К сожалению, ваш ответ будет иметь смысл только для UIViewControllers. Если мы говорим о произвольных классах, определенных приложением (как это явно делает OP), вы просто не можете дать общий совет относительно того, когда лучше всего удалить наблюдателя из центра уведомлений. И даже в случае UIViewController потомка вы, как правило, не знаете, действительно ли _3 _ / _ 4_ подходит. - person Dirk; 26.02.2014
comment
@Dirk Вы правы, моя формулировка предыдущего комментария была недостаточно точной, извините за это. :) Я попытался заявить следующее: при работе с ViewControllers, iOS7 и ARC (как многие из нас делают в настоящее время) было бы лучше сделать, например, как предлагается в ответе RickiG, чем использовать dealloc. - person lekksi; 27.02.2014
comment
какое утверждение справа снизу и почему !!!! 1) [[NSNotificationCenter defaultCenter] addObserver: селектор: @selector (близостьChanged) имя: @UIDeviceProximityStateDidChangeNotification объект: [UIDevice currentDevice]]; 2) [[NSNotificationCenter defaultCenter] addObserver: селектор: @selector (близостьChanged) имя: объект UIDeviceProximityStateDidChangeNotification: [UIDevice currentDevice]]; - person Shrikant Phadke; 08.04.2020

Примечание: это было протестировано и работает на 100%.

Быстрый

override func viewWillDisappear(animated: Bool){
    super.viewWillDisappear(animated)
    
    if self.navigationController!.viewControllers.contains(self) == false  //any other hierarchy compare if it contains self or not
    {
        // the view has been removed from the navigation stack or hierarchy, back is probably the cause
        // this will be slow with a large stack however.
        
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }
}

ПредставленViewController:

override func viewWillDisappear(animated: Bool){
    super.viewWillDisappear(animated)
    
    if self.isBeingDismissed()  //presented view controller
    {
        // remove observer here
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }
}

Цель-C

В iOS 6.0 > version лучше удалить наблюдателя в viewWillDisappear, поскольку метод viewDidUnload устарел.

 [[NSNotificationCenter defaultCenter] removeObserver:observerObjectHere];

Во много раз лучше remove observer, когда представление было удалено из navigation stack or hierarchy.

- (void)viewWillDisappear:(BOOL)animated{
 if (![[self.navigationController viewControllers] containsObject: self]) //any other hierarchy compare if it contains self or not
    {
        // the view has been removed from the navigation stack or hierarchy, back is probably the cause
        // this will be slow with a large stack however.
        
        [[NSNotificationCenter defaultCenter] removeObserver:observerObjectHere];
    }
}

ПредставленViewController:

- (void)viewWillDisappear:(BOOL)animated{
    if ([self isBeingDismissed] == YES) ///presented view controller
    {
        // remove observer here
        [[NSNotificationCenter defaultCenter] removeObserver:observerObjectHere];
    }
}
person Paresh Navadiya    schedule 11.04.2013
comment
За исключением того, что контроллеру могут потребоваться уведомления, когда его представление не отображается (например, для перезагрузки tableView). - person wcochran; 23.05.2013
comment
@wcochran автоматически перезагружается / обновляется через viewWillAppear: - person Richard; 16.08.2013
comment
@Prince, можешь ли ты объяснить, почему viewWillDisapper лучше, чем dealloc? Итак, у нас есть добавление наблюдателя к себе, поэтому, когда самость будет удалена из памяти, она вызовет dealloc, а затем все наблюдатели будут удалены, это плохая логика. - person Matrosov Alexander; 22.04.2014
comment
Вызов removeObserver:self в любом из UIViewController жизненного цикла почти гарантированно испортит вам неделю. Дополнительная литература: subjective-objective-c.blogspot.com / 2011/04 / - person cbowns; 08.11.2014
comment
Помещение вызовов removeObserver в viewWillDisappear, как указано, определенно правильный путь, если контроллер представлен через pushViewController. Если вы поместите их в dealloc вместо этого, dealloc никогда не будет вызываться - по крайней мере, по моему опыту ... - person Christopher King; 11.11.2014
comment
как сделать то же самое в быстром без преобразования типа [self.navigationController viewControllers] в NSArray ?? - person raw3d; 07.01.2015
comment
РЕДАКТИРОВАНИЕ, предлагающее проверить иерархию навигации для контроллера, является идеальным решением для точки @ wcochran. Очень полезно - person wuf810; 29.04.2015

Начиная с iOS 9, больше не нужно удалять наблюдателей.

В OS X 10.11 и iOS 9.0 NSNotificationCenter и NSDistributedNotificationCenter больше не будут отправлять уведомления зарегистрированным наблюдателям, которые могут быть освобождены.

https://developer.apple.com/library/mac/releasenotes/Foundation/RN-Foundation/index.html#10_11NotificationCenter

person Sebastian    schedule 24.04.2016
comment
Может быть, они не будут посылать сообщения наблюдателям, но я считаю, что они, насколько я понимаю, будут твердо ссылаться на них. В этом случае все наблюдатели останутся в памяти и произведут утечку. Поправьте меня, если я ошибаюсь. - person fir; 21.10.2016
comment
Связанная документация подробно описывает это. TL; DR: это слабая ссылка. - person Sebastian; 21.10.2016
comment
но, конечно, это все еще необходимо, если вы сохраняете объект, ссылающийся на них, и просто не хотите больше слушать уведомления - person TheEye; 14.03.2018

Если наблюдатель добавлен в контроллер представления, я настоятельно рекомендую добавить его в viewWillAppear и удалить в viewWillDisappear.

person RickiG    schedule 08.08.2012
comment
Мне любопытно, @RickiG: почему вы рекомендуете использовать viewWillAppear и viewWillDisappear для viewControllers? - person Isaac Overacker; 12.12.2012
comment
@IsaacOveracker по нескольким причинам: ваш код настройки (например, loadView и viewDidLoad) потенциально может вызвать запуск уведомлений, и ваш контроллер должен отразить это до того, как он появится. Если вы сделаете это так, есть несколько преимуществ. В тот момент, когда вы решили оставить контроллер, вас не волнуют уведомления, и они не заставят вас выполнять логику, пока контроллер выталкивается с экрана и т. Д. Существуют особые случаи, когда контроллер должен получать уведомления, когда он выключен - экран Я думаю, вы не можете этого сделать. Но подобные события, вероятно, должны быть в вашей модели. - person RickiG; 12.12.2012
comment
@IsaacOveracker также с ARC было бы странно реализовать dealloc для отказа от подписки на уведомления. - person RickiG; 12.12.2012
comment
Из тех, что я пробовал, с iOS7 это лучший способ зарегистрировать / удалить наблюдателей при работе с UIViewControllers. Единственная загвоздка в том, что во многих случаях вы не хотите, чтобы наблюдатель удалялся при использовании UINavigationController и помещении другого UIViewController в стек. Решение: вы можете проверить, появляется ли VC в viewWillDisappear, вызвав [self isBeingDismissed]. - person lekksi; 24.02.2014
comment
Извлечение контроллера представления из контроллера навигации может не вызвать немедленного вызова dealloc. Возврат к контроллеру представления может затем вызвать несколько уведомлений, если наблюдатель добавлен в команды инициализации. - person Jonathan Lin; 03.06.2014

В общем положил в метод dealloc.

person Raphael Petegrosso    schedule 24.06.2011

В быстром использовании deinit, потому что dealloc недоступен:

deinit {
    ...
}

Документация Swift:

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

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

person Morten Holmgaard    schedule 22.01.2015
comment
Неправильный! Вы никогда не должны отказываться от подписки в deinit, потому что это бесполезно. Когда экземпляр очищается из памяти, iOS автоматически отписывается от него, затем он вызывает deinit, поэтому он бесполезен. - person Alexander Volkov; 03.12.2020
comment
@AlexanderVolkov Пожалуйста, помните, что этому ответу 5 лет, когда Swift был совершенно новым. В то время это было решение, но с тех пор оно изменилось. - person Morten Holmgaard; 04.12.2020
comment
Неа. Если вызывается deinit, iOS автоматически отписывает наблюдателя. Это одинаково в ObjC и Swift, это зависит от системы, а не от языка. Наверное я ошибаюсь, но тогда ссылку на документацию дам. - person Alexander Volkov; 05.12.2020

* изменить: этот совет относится к iOS ‹= 5 (даже там вы должны добавлять в viewWillAppear и удалять в viewWillDisappear - однако совет применим, если по какой-то причине вы добавили наблюдателя в viewDidLoad)

Если вы добавили наблюдателя в viewDidLoad, вы должны удалить его как в dealloc, так и в viewDidUnload. В противном случае вы добавите его дважды, когда viewDidLoad будет вызван после viewDidUnload (это произойдет после предупреждения памяти). Это не обязательно в iOS 6, где viewDidUnload устарел и не будет вызываться (поскольку представления больше не выгружаются автоматически).

person Ehren    schedule 25.11.2012
comment
Добро пожаловать в StackOverflow. Пожалуйста, ознакомьтесь с FAQ по MarkDown (значок вопросительного знака рядом с полем редактирования вопроса / ответа). Использование Markdwon повысит удобство использования вашего ответа. - person marko; 25.11.2012

На мой взгляд, следующий код не имеет смысла в ARC:

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

В iOS 6 также нет смысла удалять наблюдателей в viewDidUnload, потому что он устарел.

Подводя итог, я всегда делаю это в viewDidDisappear. Однако это также зависит от ваших требований, как сказал @Dirk.

person kimimaro    schedule 16.01.2013
comment
Многие люди все еще пишут код для более старых версий iOS, чем iOS6 .... :-) - person lnafziger; 16.01.2013
comment
В ARC вы можете использовать этот код, но без строки [super dealloc]; Подробнее см. Здесь: developer.apple.com/library/ios/#releasenotes/ObjectiveC/ - person Alex; 07.03.2013
comment
Что, если бы у вас был обычный NSObject в качестве наблюдателя за уведомлением? Вы бы использовали в этом случае dealloc? - person qix; 24.05.2013

Думаю, я нашел надежный ответ! Мне пришлось, поскольку приведенные выше ответы неоднозначны и кажутся противоречивыми. Я просмотрел поваренные книги и руководства по программированию.

Во-первых, стиль addObserver: в viewWillAppear: и removeObserver: в viewWillDisappear: у меня не работает (я тестировал его), потому что я отправляю уведомление в контроллер дочернего представления для выполнения кода в контроллере родительского представления. Я бы использовал этот стиль только в том случае, если бы отправлял и слушал уведомление в том же контроллере представления.

Ответ, на который я буду полагаться больше всего, я нашел в «Программировании iOS: Руководство Big Nerd Ranch Guide 4th». Я доверяю ребятам из BNR, потому что у них есть учебные центры iOS, и они не просто пишут очередную кулинарную книгу. Вероятно, в их интересах быть точными.

Первый пример BNR: addObserver: в init:, removeObserver: в dealloc:

BNR, пример два: addObserver: в awakeFromNib:, removeObserver: в dealloc:

… При удалении наблюдателя в dealloc: они не используют [super dealloc];

Надеюсь, это поможет следующему человеку ...

Я обновляю этот пост, потому что Apple теперь почти полностью отказалась от раскадровок, поэтому вышеупомянутое может не относиться ко всем ситуациям. Важная вещь (и причина, по которой я добавил этот пост в первую очередь) - обратить внимание, если ваш viewWillDisappear: получает звонок. Когда приложение вошло в фоновый режим, это было не для меня.

person Murat Zazi    schedule 13.06.2014
comment
Трудно сказать, правильно ли это, поскольку важен контекст. Об этом уже упоминалось несколько раз, но dealloc не имеет смысла в контексте ARC (который на данный момент является единственным контекстом). Также непредсказуемо, когда вызывается dealloc - viewWillDisappear легче контролировать. Примечание: если вашему ребенку нужно что-то сообщить своему родителю, шаблон делегата кажется лучшим выбором. - person RickiG; 12.08.2015

Принятый ответ небезопасен и может вызвать утечку памяти. Пожалуйста, оставьте отмену регистрации в dealloc, но также отмените регистрацию в viewWillDisappear (это, конечно, если вы зарегистрируетесь в viewWillAppear) .... Я ВСЕГДА ДЕЛАЛ ТАК И ЭТО РАБОТАЕТ ОТЛИЧНО! :)

person MobileMon    schedule 27.06.2013
comment
Я согласен с этим ответом. Я получаю предупреждения и утечки памяти, приводящие к сбоям после интенсивного использования приложения, если я не удаляю наблюдателей в viewWillDisappear. - person SarpErdag; 11.10.2014

Также важно отметить, что viewWillDisappear вызывается также, когда контроллер представления представляет новый UIView. Этот делегат просто указывает, что главное представление контроллера представления не отображается на дисплее.

В этом случае удаление уведомления в viewWillDisappear может быть неудобным, если мы используем уведомление, чтобы позволить UIview взаимодействовать с родительским контроллером представления.

В качестве решения я обычно удаляю наблюдателя одним из этих двух методов:

- (void)viewWillDisappear:(BOOL)animated {
    NSLog(@"viewController will disappear");
    if ([self isBeingDismissed]) {
        NSLog(@"viewController is being dismissed");
        [[NSNotificationCenter defaultCenter] removeObserver:self name:@"actionCompleted" object:nil];
    }
}

-(void)dealloc {
    NSLog(@"viewController is being deallocated");
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"actionCompleted" object:nil];
}

По тем же причинам, когда я отправляю уведомление в первый раз, мне нужно учитывать тот факт, что каждый раз, когда над контроллером появляется представление с, запускается метод viewWillAppear. Это, в свою очередь, приведет к созданию нескольких копий одного и того же уведомления. Поскольку нет способа проверить, активно ли уведомление, я устраняю проблему, удаляя уведомление перед его добавлением:

- (void)viewWillAppear:(BOOL)animated {
    NSLog(@"viewController will appear");
    // Add observers
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"imageGenerated" object:nil]; // This is added to avoid duplicate notifications when the view is presented again
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedImageFromCameraOrPhotolibraryMethodOnListener:) name:@"actionCompleted" object:nil];

}
person Alex    schedule 22.01.2017

Это единственно правильный ответ (все остальные ошибочно предлагают использовать deinit и dealloc - это явное непонимание жизненного цикла экземпляра класса и системы iOS).

Swift 5

Есть два случая использования уведомлений:

  • они необходимы только, когда контроллер представления на экране (viewWillAppear + viewWillDisappear)
  • они необходимы всегда, даже если пользователь открыл другой экран поверх текущего (viewDidLoad + viewWillDisappear с если).

В первом случае правильное место для добавления и удаления наблюдателя:

    /// Add observers
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        NotificationCenter.default.addObserver(...)
    }

    /// Remove observers
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)

// remove when screen dismissed
        NotificationCenter.default.removeObserver(self) 
    }

для второго случая правильный способ:

    /// Add observers
    override func viewDidLoad() {
        super.viewDidLoad()
        NotificationCenter.default.addObserver(...)
    }

    /// Remove observers
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)

// remove only when view controller is removed disappear forever
        if self.isBeingDismissed 
        || !(self.navigationController?.viewControllers.contains(self) ?? true) {
            NotificationCenter.default.removeObserver(self)
        }
    }

И никогда не вставляйте removeObserver в deinit{ ... } или dealloc - это ОШИБКА!

person Alexander Volkov    schedule 03.07.2017

person    schedule
comment
Я бы изменил порядок этих инструкций ... Использование self после [super dealloc] заставляет меня нервничать ... (даже если получатель вряд ли действительно разыменует указатель каким-либо образом, ну, вы никогда не знаете, как они реализовали NSNotificationCenter) - person Dirk; 24.06.2011
comment
Хм. это сработало для меня. Вы заметили какое-нибудь необычное поведение? - person Legolas; 24.06.2011
comment
Неа. Это было просто общее замечание. Это похоже на использование указателя malloc ed после вызова free для меня ... - person Dirk; 24.06.2011
comment
Дирк прав - это неверно. [super dealloc] всегда должен быть последним оператором вашего dealloc метода. Он разрушает ваш объект; после его запуска у вас больше нет действующего self. / cc @Dirk - person jscs; 24.06.2011
comment
@ Джош: Привет, чувак. Так ты в этом уверен? Итак, вы говорите, что все dealloc утверждения не работают (или) ничего не значат, если я поступаю таким образом? - person Legolas; 24.06.2011
comment
@Legolas: Они могут работать большую часть времени, но они небезопасны. - person jscs; 24.06.2011
comment
@ Джош: Ну да. До сих пор они работали на меня. Позвольте мне попробовать поменять местами по-вашему. Может быть, это были причины memory leaks - person Legolas; 24.06.2011
comment
Если вы используете ARC на iOS 5+, я думаю, что [super dealloc] больше не нужен - person pixelfreak; 16.04.2012
comment
@pixelfreak сильнее, в ARC нельзя вызывать [super dealloc] - person tapmonkey; 26.03.2013
comment
Так нужно ли еще удалитьObserver в dealloc с помощью ARC? - person Alexandre; 04.09.2013
comment
Его нормально положить туда. Вам нужно в основном разместить это в зависимости от жизненного цикла VC. viewDidDisappear - хорошее место. - person Legolas; 17.09.2013
comment
решать вам .. вы можете удалить их viewWillDisapper или viewDidDisapper методами. - person Ans; 14.07.2014
comment
Еще лучше удалить наблюдателя в dealloc, но без очевидного вызова super (это делается автоматически ARC). - person Borzh; 26.09.2015
comment
Это неправильный ответ. Если вызывается dealloc, то подписка на экземпляр уже отменена (системой). - person Alexander Volkov; 03.12.2020