我在调用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”附加到数字变量。是否有任何好的网站/教程可以更深入地解释这一点,所以我知道如何对任何类型的对象进行此操作?
答案 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"];
希望有所帮助。