7

Bir ViewController (bir MKMapView ile) hangi NavigasyonController nedeniyle, içine itti var. Bu yüzden bir "geri" tuşu olan bir NavBar'ım var.iPhone - Bir sınıf örneği ... ayrılmaya devam ederken anahtar değer gözetleme işlemi devam ederken

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”.

Ben viewDidLoad yöntemi bir Observer ile hayata geçirdik: o arka düğmesini tıklamak bir hata alıyorum

- (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]; 

}

Benim dealloc:

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

Burada neyin yanlış olduğunu kimse anlatabilir mi? NavBar'daki geri düğmesini tıklıyorum ve sonra dealloc yöntemine giriyorum ve daha sonra daha yüksek ViewController'a geçiyor ve bu hatayı atar.

Çok teşekkürler & Saygılarımızla.

cevap

12

Farklı nesneler üzerinde bir gözlemciyi ayarlayıp kaldırıyorsunuz. Görünüm denetleyicisini, ilk kod örneğindeki userLocation öğesinin bir gözlemcisi olarak ekliyorsunuz, ardından bunu, ikincideki varsayılan bildirim merkezinden kaldırmaya çalışıyorsunuz. Gözlemciyi userLocation öğesinden doğru bir şekilde kaldırmak için, -dealloc yönteminizi aşağıdaki gibi değiştirin:

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

Bu işlem harikadır! artık hata yok. – Tim

+0

Daha spesifik olarak, iki farklı bildirim modelini birleştiriyordunuz: NSNotifications ve KVO. (Brad'in çözümü doğru olsa da!) –

İlgili konular