我遇到了KVO的问题,其中observeValueForKeyPath被触发两次,即使didChangeValueForKey肯定只被调用一次。使用调试器逐步执行代码,didChangeValueForKey将执行,将调用observeValueForKeyPath,执行它的代码,然后再次立即调用。我查看了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];
}
我已经将观察者代码从对象移动到应用程序,一切正常。在observeValueForKeyPath中,app刚刚调用了对象的处理代码:
[self.apiObject processCmd:@"apiCmd"];
通过Instruments运行原始代码没有任何内存泄漏。我根本无法追踪问题..
部分答案:
部分问题的答案如下:
在我的应用程序中:
@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;
}
查找会员和财产之间的拼写错误。 在调试器中,可以看到null mainObjctPtr,但mainObjtPtr不能。显然,引用app.mainObjtPtr的代码正在运行。