2014-04-18 45 views
1

兩個對象在使用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

+1

看起來這似乎與你的init方法中發生的其他事情有關。也許發佈可以幫助我們? –

+0

完成。這樣做使我意識到我最近也更新了CorePlot。 –

+0

只是爲了檢查,你在'recordUpdated'方法中有一個'NSLog'(或一個斷點)是檢查它的被調用? (我知道這聽起來很明顯,但它很容易做到!) – Rich

回答

1

無論何時設置託管圖或collapsesLayers屬性,核心Plot託管視圖都會將其自身作爲所有通知的觀察者移除。如果您希望我們修復此問題,請發佈有關issue tracker的錯誤報告。

與此同時,在設置圖形後添加您的觀察者。

+0

我沒有想過要通過CorePlot源代碼。但是,是的,它在'updateNotifications'方法下。我還注意到'dealloc'也已經調用'removeObserver'。我看到有兩種方法可以調用它:'setHostedGraph'和'setCollapsesLayers'。我想我會把它作爲一個錯誤發佈,因爲我想知道如何在每次修改圖結構時不需要定期重新調用'adddObserver'就能可靠地繼承'CPTGraphHostingView'。 –

0

自訂可能會在您訂閱通知中心後重新分配。您可以將代碼

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

或移動到可能 - viewDidLoad中

+0

我添加了一些額外的代碼和筆記。這些不是UIViews,所以它們不會從Nibs中喚醒。 –

+0

@Adam -prepareGraph做什麼? –

+0

Core Plot宿主視圖是UIView的子類。因此,你的子類也是。 –