КВО с подклассами - PullRequest
0 голосов
/ 02 апреля 2012

РЕДАКТИРОВАТЬ: с тех пор я нашел часть ответа.Который я добавил внизу вопроса.

У меня была проблема с KVO, когда наблюдающий запускValueForKeyPath запускался дважды, даже если didChangeValueForKey определенно вызывался только один раз.Шагая по коду с помощью отладчика, didChangeValueForKey выполнится, будет вызван наблюдающийValueForKeyPath, выполнит его код, а затем снова будет вызван немедленно.Я просмотрел stackoverflow и Google, и ни один из сценариев там, похоже, не подходит для моей проблемы.

Псевдокод выглядит так:

@interface superClass : NSObject
...
@interface subclass : superClass
...

@implementation superClass

-(id)init
{
if((self = [super init]))
    [self.apiInterface addObserver:self forKeyPath:@"apiCmd" options:0 context:nil];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if([keyPath compare:@"apiCmd"] == NSOrderedSame)
        [self processCmd:@"apiCmd"];
}

-(void)dealloc
{
    [self removeObserver:self.apiInterface forKeyPath:@"apiCmd" context:nil];
}

С тех пор я переместил наблюдателяКод от объекта до приложения, и все работает правильно.В наблюдаемом ValueForKeyPath приложение просто вызывало код обработки объекта:

[self.apiObject processCmd:@"apiCmd"];

При выполнении исходного кода через инструменты не было никаких утечек памяти.Я просто не мог отследить проблему вообще ..

ЧАСТИЧНЫЙ ОТВЕТ:

Ответ на часть этой проблемы следующий:

В приложении, которое я имел:

@interface AppDelegate : UIResponder
{
    subClass *mainObject;
    subClass *mainObjctPtr;
}

@property (nonatomic, retain) subClass *mainObject;
@property (nonatomic, retain) subClass *mainObjtPtr;

@implemenation AppDelegate

@synthezise mainObject;
@synthezise mainObjtPtr;

....

-(void)initData
{
     self.mainObject = [[subClass alloc] init];
     self.mainObjtPtr = self.mainObject;
}

Ищите опечатку между участником и собственностью.В отладчике можно было видеть нулевой mainObjctPtr, но mainObjtPtr не мог.Очевидно, что код, который ссылался на app.mainObjtPtr, работал.

...