2013-10-08 2 views
-1

У меня есть объект, который наследуется от класса MKPlacemark MapKit. У меня есть запуск методы во время viewDidLoad моего ViewController, что создает такой объект (Alloc + INIT) и передать его в MapView следующегоОсвобождение объекта

[self.mapView addAnnotation:<my instance of my class inheriting MKPlacemark>] 

Однако, когда я запускаю свою программу, я получаю следующее сообщение об ошибке:

An instance 0x9a5d650 of class <name of my class> was deallocated while key value 
observers were still registered with it. Observation info was leaked, and may even 
become mistakenly attached to some other object. Set a breakpoint on 
NSKVODeallocateBreak to stop here in the debugger. 

Обратите внимание, что я использую ARC. Может ли кто-нибудь сказать мне, как я могу избежать такого освобождения?

Спасибо!

EDIT: Моя проблема не предупреждение само по себе, это то, что я не хочу, чтобы этот объект был DEALLOCATE в тот момент ...

EDIT2: Код класса является следующая

заголовочный файл выглядит следующим образом

@interface OPTCreatureMark : MyMark 

@property (nonatomic, assign) CLLocationCoordinate2D coordinate; 

-(id)initWithCoordinate:(CLLocationCoordinate2D)coordinate; 
@end 

и .m, как этого

@implementation MyMark 

@synthesize coordinate; 

-(id) initWithCoordinate:(CLLocationCoordinate2D)coordinate_ { 
    if (self = [super initWithCoordinate:coordinate_ addressDictionary:nil]) { 

     self.coordinate=coordinate_; 

     return self; 
    } else { 
     return nil; 
    } 
} 
@end 

+5

Вы используете KVO здесь, в любом из ваших классов? – Unheilig

+2

Какой класс был освобожден? Контроллер просмотра на экране? Вид на экране? Модель в этом контроллере? Модель, используемая другим контроллером? Это предупреждение означает, что вы забыли «removeObserver: forKeyPath:« где-то ». – Kevin

+0

Это мой класс, наследующий MKPlacemark. – user1553136

ответ

1

Если вы действительно используете КВО, это звучит, как вам нужно удалить наблюдателя в dealloc метод вашего объекта следующим образом:

[self removeObserver:self.myDelegate forKeyPath:@"zoom"]; 

В противном случае сообщения могут быть отправлены на освобождаться экземпляр вашего класса (который больше не может отвечать, потому что он был освобожден), тем самым вызывая исключение.

+0

Я предлагаю сделать это до dealloc. Во время dealloc граф объекта будет находиться в некогерентном состоянии. Если эти файлы наблюдателей во время графа объекта срываются, могут произойти плохие вещи. – bbum

Смежные вопросы