1

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

4

2 回答 2

1

collapsesLayers每当您设置托管图或属性时,Core Plot 托管视图都会将自己移除为所有通知的观察者。如果您希望我们修复它,请在问题跟踪器上发布错误报告。

同时,在您设置图表后添加您的观察者。

于 2014-04-18T20:11:55.467 回答
0

订阅通知中心后,可能会重新分配 self 。你能把代码移到

-(void)awakeFromNib
{
    [[NSNotificationCenter defaultCenter]addObserver: self  selector:@selector(recordUpdated) name:@"recordUpdated" object:nil];
}

或者也许是-viewDidLoad

于 2014-04-18T13:48:25.373 回答