两个对象在使用NSNotifications 5.1 (和CorePlot 1.4)之前接收XCode非常好。但是,使用XCode 5.1.1 (Coreket1.5),我发现如果addObserver调用在init方法中,它实际上不会被注册(仅对于这两个类,它在不同类的父对象中工作)。我甚至在调用前后放置了一个NSLog,以确保代码仍然工作。这些对象都是由它们的共享父对象强烈引用的,它们的父对象接收必要的通知而不发出任何问题。而且,我在dealloc中有一个dealloc,其中removeObserver is -it不是早期调用的,因为对象是正确保留的。
//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调用的另一个方法内时,它会起作用吗?
编辑和注释:
我添加了更多的代码来显示init。我还添加了注释,它是CorePlot的一个图形视图,CorePlot最近也被更新为1.5 (我忘记了),-which可能是问题的根源。
领导齐柏林飞艇的建议,它正在重新分配,似乎是可能的。但是,从NSNotificationCenter到现在的dealloc对象的调用不是会使程序崩溃吗(注意,dealloc不是叫--我在那里有一个NSLog )?我可以很容易地通过在init中打印对象实例字符串来测试这一点,然后再打印出来。我昨晚确实测试了这个实例,但是我不认为我把这个部分复制到了init中。
发布于 2014-04-18 20:11:55
每当您设置托管图形或collapsesLayers属性时,核心绘图宿主视图将作为所有通知的观察者。如果您想让我们修复,请在问题跟踪器上发布一份错误报告。
同时,在设置图形之后添加您的观察者。
发布于 2014-04-18 13:48:25
在订阅通知中心之后,self可能会被重新分配。你能把代码移到
-(void)awakeFromNib
{
[[NSNotificationCenter defaultCenter]addObserver: self selector:@selector(recordUpdated) name:@"recordUpdated" object:nil];
}或者-viewDidLoad?
https://stackoverflow.com/questions/23155375
复制相似问题