Zhe*_*hen 101 objective-c nsnotifications ios
我有一个客观的C类.在其中,我创建了一个init方法并在其中设置了NSNotification
//Set up NSNotification
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(getData)
name:@"Answer Submitted"
object:nil];
Run Code Online (Sandbox Code Playgroud)
我在哪里设置[[NSNotificationCenter defaultCenter] removeObserver:self]
这门课程?我知道,对于a UIViewController
,我可以将它添加到viewDidUnload
方法中如果我刚刚创建了一个目标c类,需要做什么?
Dir*_*irk 112
通用答案将是"一旦您不再需要通知".这显然不是一个令人满意的答案.
我建议你[notificationCenter removeObserver: self]
在dealloc
这些类的方法中添加一个调用,你打算用它作为观察者,因为它是彻底取消注册观察者的最后机会.但是,这只会保护您免受由于通知中心通知死对象而导致的崩溃.当您的对象尚未/不再处于可以正确处理通知的状态时,它无法保护您的代码免受接收通知.为此...见上文.
编辑(因为答案似乎吸引了比我想象的更多的评论)我在这里想说的是:关于什么时候最好从通知中心删除观察者,很难给出一般性的建议,因为这取决于:
所以,我可以提出最好的一般建议:保护你的应用程序.对于至少一次可能的失败,请removeObserver:
跳舞dealloc
,因为那是最后一点(在物体的生命中),你可以干净地做到这一点.这并不意味着:"只要将删除推迟到dealloc
被调用,一切都会好的".相反,只要对象不再准备好(或需要)接收通知,就立即删除观察者.那是恰到好处的时刻.不幸的是,不知道上面提到的任何问题的答案,我甚至无法猜测,那个时刻会是什么时候.
你总是可以安全地removeObserver:
多次对象(除了与给定观察者的第一次调用之外的所有对象都是nops).因此:考虑做(再次)dealloc
只是为了确保,但首要的是:在适当的时候(由您的用例决定).
Par*_*iya 38
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)
}
}
Run Code Online (Sandbox Code Playgroud)
override func viewWillDisappear(animated: Bool){
super.viewWillDisappear(animated)
if self.isBeingDismissed() //presented view controller
{
// remove observer here
NSNotificationCenter.defaultCenter().removeObserver(self)
}
}
Run Code Online (Sandbox Code Playgroud)
在iOS 6.0 > version
,不推荐使用viewWillDisappear
as viewDidUnload
方法删除观察者.
[[NSNotificationCenter defaultCenter] removeObserver:observerObjectHere];
Run Code Online (Sandbox Code Playgroud)
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];
}
}
Run Code Online (Sandbox Code Playgroud)
- (void)viewWillDisappear:(BOOL)animated{
if ([self isBeingDismissed] == YES) ///presented view controller
{
// remove observer here
[[NSNotificationCenter defaultCenter] removeObserver:observerObjectHere];
}
}
Run Code Online (Sandbox Code Playgroud)
Seb*_*ian 38
从iOS 9开始,不再需要删除观察者.
在OS X 10.11和iOS 9.0中,NSNotificationCenter和NSDistributedNotificationCenter将不再向可能已解除分配的已注册观察者发送通知.
Ric*_*kiG 25
如果将观察者添加到视图控制器中,我强烈建议将其添加到其中并将其viewWillAppear
删除viewWillDisappear
.
Leg*_*las 19
-(void) dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super dealloc];
}
Run Code Online (Sandbox Code Playgroud)
在快速使用deinit因为dealloc不可用:
deinit {
...
}
Run Code Online (Sandbox Code Playgroud)
Swift文档:
在取消分配类实例之前立即调用deinitializer.您使用deinit关键字编写deinitializers,类似于使用init关键字编写初始化器的方式.Deinitializers仅适用于班级类型.
通常,在取消分配实例时,您无需执行手动清理.但是,当您使用自己的资源时,可能需要自己执行一些额外的清理.例如,如果创建自定义类以打开文件并向其写入一些数据,则可能需要在取消分配类实例之前关闭该文件.
*编辑:此建议适用于iOS <= 5(即使您应该添加viewWillAppear
和删除viewWillDisappear
- 但是如果出于某种原因您已添加观察者,则建议适用viewDidLoad
)
如果你已经添加的观察者viewDidLoad
,你应该在这两个删除dealloc
和viewDidUnload
.否则你最后会在viewDidLoad
调用之后添加两次viewDidUnload
(这将在内存警告之后发生).这在iOS 6中不是必需的,viewDidUnload
不推荐使用并且不会被调用(因为视图不再自动卸载).
在我看来,以下代码在ARC中没有任何意义:
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super dealloc];
}
Run Code Online (Sandbox Code Playgroud)
在iOS 6中,删除观察者也没有意义viewDidUnload
,因为它现在已被弃用.
总而言之,我总是这样做viewDidDisappear
.但是,这也取决于你的要求,就像@Dirk说的那样.
归档时间: |
|
查看次数: |
80494 次 |
最近记录: |