3

我想检查我的视图是否正在侦听UIApplicationWillResignActiveNotification。如果正在侦听,那么我想在dealloc期间删除它。现在我想知道是否有办法使用目标c来做到这一点?有没有办法检查观察者是否在听某些NSNotification?

我不想避免多次添加通知。这里有更多的解释我正在尝试做什么。

我有自定义gridView。我可以使用缩放启用或缩放禁用来初始化它。如果启用了扩展的启用,我将自己添加为UIApplicationWillResignActiveNotification的观察者,但是如果其init的缩放禁用,那么它不会将其自身添加为该通知的观察者。现在,在dealloc中,我想将该gridView作为该通知的观察者来移除。所以我想知道是否有办法找出gridView是否正在侦听通知。

+0

你能否指定你想完成什么任务? – ivanmoskalev

+2

可能重复[如何避免添加多个NSNotification观察员?](http://stackoverflow.com/questions/5658426/how-to-avoid-adding-multiple-nsnotification-observer) – iwasrobbed

+0

有没有办法检查如果观察员已经注册。 – iwasrobbed

回答

0

如果你想检查dealloc方法,如果你的视图被注册为观察者来正确地删除它 - 你不应该。所有你需要做的是:

[[NSNotificationCenter defaultCenter] removeObserver:myView] 

,它会删除观察员您订阅

+1

只是做[[NSNotificationCenter defaultCenter] removeObserver:myView]不是很好的编程习惯。 – slonkar

2

我不知道的任何方法来检查什么通知此观测器监听所有通知,但无论它监听UIApplicationWillResignActiveNotification与否,美其名曰:

[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillResignActiveNotification]; 

会导致自我停止监听该通知,或者什么也不做,如果自己不听它。

指定通知的名称,要停止监听是最好的做法,但因为你说你把这个在dealloc中,它也将是安全的,只是这样做:

[[NSNotificationCenter defaultCenter] removeObserver:someObserver]; 
0

NSNotificationCenter不支持此开箱即用。你与KVO有同样的问题。

一般只是跟踪是否使用布尔属性注册了对象,并且只有在设置了此布尔值时才注销。

+0

'NSNotificationCenter'有点宽容,因为你总是可以删除一个观察者,如果这个对象目前不是观察者,它根本不会做任何事情。所以你总是可以通过'NSNotificationCenter'安全地调用'removeObserver:'。但是,如果您尝试删除KVO观察者但目标未观察到,则会发生异常。这意味着,您需要使用KVO跟踪您的观察状态,但不一定使用'NSNotificationCenter'。 – DarkDust

+0

@DarkDust只是因为你没有*拥有*并不意味着你*应该*不这样做。 –

相关问题