2016-11-18 3 views
0

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

[tabBarController addObserver:self 
    forKeyPath:@"selectedViewController" 
    options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld 
    context:&PrivateKVOContext 
]; (edited) 

И я хочу знать, если мой tabbarcontroller может знать, если мой ViewController слушает на этом ключевом пути

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

И в методе dealloc моего ViewController, я поставил [tabBarController removeObserver:self forKeyPath:@"selectedViewController”]; удалить себя в качестве наблюдателя

+0

Если наблюдатель не получает удален, попробуйте написать '[[NSNotificationCenter defaultCenter] removeObserver: observerObjectHere]' в 'viewWillDisappear ' – pkc456

+0

Вид касательной, но почему контроллер просмотра в контроллере панели вкладок должен быть осторожным при выборе другой вкладки? Это звучит как плохой дизайн. – rmaddy

+0

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

ответ

0

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

Как правило, рекомендуется использовать removeObserver: в дополняющем методе, в котором вы разместили addObserver:, чтобы они были надежно названы равным количеством раз.

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

-1

Это зависит от того, если наблюдатель действительно используется в вашем коде, попробуйте следующее:

- (void)dealloc { 

    @try { 
     [[NSNotificationCenter defaultCenter] removeObserver:Notification_Location_Ready]; 
    } @catch (NSException *exception) { 

    } @finally { 

    } 
} 
+2

** Не используйте **, пожалуйста. 'try-catch' - это полная ** плохая практика **. Это только скрывает очевидную ошибку в коде, но не исправляет ее. Вместо этого он должен создать некоторую структуру, чтобы держать ссылки на наблюдателей, а затем удалять их, когда они подходят. –