我有2个对象Obj1
和Obj2
。 Obj1
具有属性isLocalChanges
(BOOL
)的位置,以检查所做的任何本地更改。如果我将值设置为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:
未触发。在这一点上,我无能为力,无法找到出错的地方。
有人建议我解决这个问题......
答案 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通知。