РЕДАКТИРОВАТЬ: с тех пор я нашел часть ответа.Который я добавил внизу вопроса.
У меня была проблема с 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, работал.