密钥值当cocoa中的属性发生更改时,不会调用Observer

时间:2015-01-05 07:47:32

标签: macos cocoa key-value-observing

我有2个对象Obj1Obj2Obj1具有属性isLocalChangesBOOL)的位置,以检查所做的任何本地更改。如果我将值设置为isLocalChanges有任何更改,我需要观察此YES的更改。

我在isLocalChanges中为此属性Obj2写了一个观察者:

@interface Obj2 : NSObject
{
   Obj1 *sampleObj;
}
@property (nonatomic,retain) Obj1 * sampleObj;

@end

@implementation Obj2
@synthesize sampleObj;
- (id)init
{
    if (self = [super init])
    {
        sampleObj =  [[Obj1 alloc] init];

        [sampleObj  addObserver:self
                forKeyPath:@"isLocalChanges"
                   options:NSKeyValueObservingOptionNew
                   context:nil];
    }
    return self;
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {       
    if ([keyPath isEqualToString:@"isLocalChanges"]) {
            NSLog(@"isLocalChanges Observer");
            if ([[change objectForKey:@"new"] boolValue]) {
                 NSLog("@\n Found Local Changes...");
            }
        }

    }
}

我使用的isLocalChanges属性的声明和用法:

@interface Obj1 : NSObject
    {
       BOOL _isLocalChanges;
    }
    @property (assign) BOOL isLocalChanges;
@end

和Obj1.m

做了@synthesize isLocalChanges = _isLocalChanges;

在下面的方法中,我设置了isLocalChanges属性的值。

-(void) localChangesMade 
{
   self.isLocalChanges = YES;
}

即使isLocalChanges中的Obj1属性发生了更改,问题仍然存在,方法observeValueForKeyPath:未触发。在这一点上,我无能为力,无法找到出错的地方。

有人建议我解决这个问题......

2 个答案:

答案 0 :(得分:0)

您分配的对象超出范围,并在方法返回后立即销毁:

SomeObject *Obj2 =  [[SomeObject alloc] init];

改为使其成为实例变量。

答案 1 :(得分:0)

您使用三个不同内容(a)的标识符Obj2作为类名(b)作为实例变量/属性,并使用(c)作为局部变量。这不好

这可能是你的直接问题的第三个用途,它可能意味着使用(b)。而不是:

if (self = [super init])
{
    SomeObject *Obj2 =  [[SomeObject alloc] init];
你可能想要:

if (self = [super init])
{
    Obj2 =  [[SomeObject alloc] init];

等。 SomeObject *Obj2本地变量的生命周期只是if的正文。

但是,该修复程序允许您将类型SomeObject的实例分配给类型为Obj1的属性,因此您可能也遇到问题。

最后,您永远不会显示isLocalChanges的声明或使用,因此没有任何迹象表明您实际使用其设置者分配给此媒体资源 - 如果您不是,那么就赢了&# 39;是任何KVO通知。