[英]iOS observeValueForKeyPath not getting called
我在调用 observeValueForKeyPath 时遇到问题,但使用以下方法解决了它:
但是,我想知道如何处理这个问题以供将来参考。
有效的代码如下所示:
- (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”附加到数字变量中。 是否有任何好的网站/教程可以更深入地解释这一点,所以我知道如何对任何类型的 object 执行此操作?
KVO 通过调配方法和通知值变化来工作。 如果您在没有 self 的情况下访问您的属性,那么您将直接访问 iVar 而不是使用该方法。 不使用方法时,无法向观察者发送 KVO 通知。 您遇到的另一个问题是可变数据与不可变数据。 当您附加一个字符串时,您不会更改 object 但您正在更改它指向的数据,这就是您没有收到任何通知的原因。 只有 get 访问器被调用来获取字符串,然后你在上面调用 append 数据。
您的 memory mgmt 似乎关闭了。 假设 '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"];
希望有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.