【发布时间】:2014-04-18 13:40:37
【问题描述】:
在使用 XCode 5.1(和 CorePlot 1.4)之前,两个对象在接收 NSNotifications 之前工作得很好。但是,使用 XCode 5.1.1 (Coreplot 1.5) 我发现如果 addObserver 调用在 init 方法内,它实际上不会被注册(仅对于这两个类,它在不同的类别)。我什至在通话前后都添加了NSLog,以确保代码仍然有效。这两个对象都被它们的共享父级强烈引用,并且它们的父级会毫无问题地接收必要的通知。而且,我在dealloc 中有一个NSLog,其中removeObserver 是-它不会提前调用,因为对象被正确保留。
//The object is a CorePlot CPTGraphHostingView
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
//other code setting up a few private ivar primitive arrays and values
//this is where the call was (there are actually 3 Observer calls made)
[[NSNotificationCenter defaultCenter]
addObserver: self
selector: @selector(recordUpdated)
name: @"recordUpdated"
object: nil];
//then this is called before the end
[self prepareGraph];
//this is where I moved it
[self startListening];
}
return self;
}
同样,自从我上次使用 XCode 5.1(和 CorePlot 1.4)编译它以来,发送通知的对象或这两个类的代码没有任何改变。并且在父级的init 中使用了相同的调用,并且运行良好。昨晚我唯一的解决方案是将addObserver 调用重构为一个新方法,并在init 末尾调用该方法。
但是,我不明白为什么这是必要的。谁能想到将addObserver 放在init 中间会被“忽略”的原因,但是当在init 调用的另一个方法中时,它可以工作吗?
编辑和注释:
我添加了更多代码来显示初始化。我还添加了注释,它是 CorePlot 的图形视图,CorePlot 最近也更新到了 1.5(我忘记了)——这可能是问题的根源。
lead_the_zeppelin 建议重新分配它似乎是可能的。但是,从 NSNotificationCenter 到 -now-dealloc'd 对象的调用不会使程序崩溃(注意,不调用 dealloc - 我在那里有一个NSLog)?我可以通过在init 中打印对象实例字符串来轻松测试这一点,然后再打印。我昨晚确实测试了这个,要求提供实例,但我认为我没有将那个位复制到init。
【问题讨论】:
-
这似乎与您的 init 方法中发生的其他事情有关。也许发帖可以让我们提供帮助?
-
完成。这样做让我意识到我最近也更新了 CorePlot。
-
只是为了检查一下,您在
recordUpdated方法中有一个NSLog(或断点),是的,可以检查它是否被调用? (我知道这听起来很明显,但它很容易做到!) -
你也可以发布发送通知的代码吗:)
-
您在使用 ARC 吗?您可以尝试在启用 NSZombies 的情况下运行,以查看是否发生了提前释放。
标签: ios objective-c core-plot nsnotificationcenter addobserver