iOS observeValueForKeyPath未被调用

时间:2011-07-12 02:34:23

标签: iphone ios model-view-controller observer-pattern

我在调用observeValueForKeyPath时遇到了问题,但是使用它来解决它:

observeValueForKeyPath not being called

但是,我想知道如何处理这个问题以供将来参考。

有效的代码如下所示:

 - (void) input: (NSString*) digit
 {
     NSLog(@"input() - Entering... digit=%@", digit);

     if ([digits length] <  MAX_DIGITS_LENGTH)
     {
         self.digits = [[[ self.digits autorelease] stringByAppendingString:digit] retain];
         NSLog(@"digits is now %@", digits);
     }

 }

在此之前,我使用的是NSMutableString而不是NSString,只是说使用了appendString。我没有做任务,我没有将“self”附加到数字变量。是否有任何好的网站/教程可以更深入地解释这一点,所以我知道如何对任何类型的对象进行此操作?

2 个答案:

答案 0 :(得分:4)

KVO通过方法调配和通知价值变化来工作。如果您使用自己访问属性,则直接访问iVar而不使用该方法。不使用方法时,无法向观察者发送KVO通知。您遇到的另一个问题是可变数据与不可变数据。当您附加一个字符串时,您不会更改该对象,但您正在更改它指向的数据,这就是您没有收到任何通知的原因。只调用了get访问器来获取字符串,然后调用了附加数据。

答案 1 :(得分:0)

您的记忆管理似乎已关闭。假设'digits'是使用retain或copy属性声明的@property,并且您正在使用合成的setter(或者自己编写一个等效的setter),那么你应该使用这样的setter:

self.digits = [self.digits stringByAppendingString:digit];

您不应该自动释放旧值或保留新值,因为setter会为您执行此操作。

如果你想在那里使用NSMutableString,你可以像这样手动触发KVO通知:

 [self willChangeValueForKey:@"digits"];
 [self.digits appendString:whatever]; // assumes digits is a mutable string now
 [self didChangeValueForKey:@"digits"];

希望有所帮助。