繁体   English   中英

iOS observeValueForKeyPath 没有被调用

[英]iOS observeValueForKeyPath not getting called

我在调用 observeValueForKeyPath 时遇到问题,但使用以下方法解决了它:

未调用 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM