KVO与子类

时间:2012-04-01 21:53:00

标签: objective-c ios xcode4.2 subclass key-value-observing

编辑:我已经找到了部分答案。我已经在问题的底部添加了。

我遇到了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的代码正在运行。

0 个答案:

没有答案