兩個對象在使用XCode 5.1(和CorePlot 1.4)之前很好地接收了NSNotifications
。但是,使用XCode 5.1.1(Coreplot 1.5)時,我發現如果addObserver
調用位於init
方法中,它實際上不會被註冊(僅針對這兩個類,它在不同類的父對象中工作)。我甚至在調用之前和之後放了一個NSLog
以確保代碼仍然有效。這些對象都由其共享的父級強烈引用,並且他們的父級接收到必要的通知而沒有問題。而且,我在dealloc
中有一個NSLog
,其中removeObserver
-因爲對象被正確保留,所以不會提前調用。NSNotificationCenter addObserver被忽略
//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
的末尾調用該方法。
但是,我不明白爲什麼這是必要的。任何人都可以想到放置在init
中間的原因會被「忽略」,但是當在init
調用的另一種方法中時,它起作用了嗎?
編輯和註釋:
我增加了更多的代碼來顯示初始化。我還補充說,這是一個CorePlot的圖形視圖,CorePlot最近也更新到了1.5(我忘記了這一點) - 這可能是問題的根源。
lead_the_zeppelin建議它正在重新分配,似乎是可能的。但是從NSNotificationCenter調用一個-now-dealloc'd對象會不會導致程序崩潰(請注意,dealloc不會被調用 - 我在那裏有一個NSLog
)?我可以通過在init
中打印對象實例字符串,然後再輕鬆地進行測試。我昨天晚上做了這個測試,詢問了這個實例,但我不認爲我將這一點複製到了init
。
看起來這似乎與你的init方法中發生的其他事情有關。也許發佈可以幫助我們? –
完成。這樣做使我意識到我最近也更新了CorePlot。 –
只是爲了檢查,你在'recordUpdated'方法中有一個'NSLog'(或一個斷點)是檢查它的被調用? (我知道這聽起來很明顯,但它很容易做到!) – Rich