7

由於NavigationController的原因,我有一個ViewController(帶有MKMapView),它被推入。所以我有一個帶有「後退」按鈕的NavBar。 單擊該後退按鈕,我得到一個錯誤:iPhone - 正在釋放類的實例...而關鍵值觀察仍然註冊了它

2010-01-11 18:05:35.273 TestApp[147:207] An instance 0x1758f0 of class MKUserLocation is being deallocated while key value observers are still registered with it. Observation info is being leaked, and may even become mistakenly attached to some other object. Set a breakpoint on NSKVODeallocateBreak to stop here in the debugger. Here's the current observation info: ( Context: 0x0, Property: 0x17d600> ) Program received signal: 「EXC_BAD_ACCESS」.

我與觀察員執行viewDidLoad方法:

- (void)viewDidLoad { 
    mapView = (MKMapView*)self.view; 
    mapView.delegate = self; 
    mapView.mapType = MKMapTypeHybrid; 
    mapView.showsUserLocation = YES; 

    // ... 

    [mapView.userLocation addObserver:self forKeyPath:@"location" options:0 context:NULL]; 
    [super viewDidLoad]; 

}

我的dealloc:

- (void)dealloc { 
    [groupId release]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
    [super dealloc]; 
} 

誰能告訴我這裏有什麼問題嗎?我單擊NavBar中的後退按鈕,然後進入dealloc方法,然後切換回較高的ViewController並引發此錯誤。

非常感謝&最好的問候。

回答

12

您正在設置和刪除不同對象上的觀察者。您將視圖控制器添加爲第一個代碼示例中userLocation的觀察者,然後嘗試將其從第二個代碼示例中的默認通知中心刪除。要正確刪除userLocation中的觀察者,請將您的-dealloc方法更改爲以下內容:

- (void)dealloc { 
    [groupId release]; 
    [mapView.userLocation removeObserver:self forKeyPath:@"location"]; 
    [super dealloc]; 
} 
+0

此作品非常棒!沒有錯誤了。 – Tim 2010-01-11 18:33:28

+0

更具體地說,您將兩種不同的通知模式組合在一起:NSNotifications和KVO。 (儘管Brad的解決方案是正確的!) – 2010-11-18 03:22:19

相關問題