NSNotifications
在使用 XCode 5.1(和 CorePlot 1.4)之前,两个对象工作得很好。但是,使用 XCode 5.1.1 (Coreplot 1.5) 我发现如果addObserver
调用在init
方法内部,它实际上不会被注册(仅对于这两个类,它在不同类的父对象中工作)。我什NSLog
至在通话之前和之后都放了一个,以确保代码仍然有效。这两个对象都被它们的共享父级强烈引用,并且它们的父级会毫无问题地收到必要的通知。而且,我有一个NSLog
在dealloc
哪里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
.