iOS НаблюдатьValueForKeyPath не вызывается - PullRequest
3 голосов
/ 12 июля 2011

У меня возникла проблема с вызовом applyValueForKeyPath, но я решил ее следующим образом:

НаблюдатьValueForKeyPath не вызывается

Однако я бы хотел знать, как с этим справиться в целом, для дальнейшего использования.

Код, который работает, выглядит следующим образом:

 - (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. Я не делал назначения и не добавлял «я» к переменной цифр. Есть ли хорошие веб-сайты / учебные пособия, которые объясняют это более подробно, поэтому я знаю, как это сделать в целом для любого типа объекта?

Ответы [ 2 ]

4 голосов
/ 12 июля 2011

КВО работает методом метания и оповещения об изменении значения. Если вы обращаетесь к своим свойствам без себя, то вы обращаетесь к iVar напрямую и не используете метод. Когда метод не используется, нет способа отправить уведомления KVO вашему наблюдателю. Другая проблема, с которой вы столкнулись - это изменчивость и неизменность данных. Когда вы добавляете строку, вы не изменяете объект, но изменяете данные, на которые он указывает, и поэтому вы не получали никаких уведомлений. Только метод доступа get вызывался для получения строки, тогда как вы вызывали добавление данных для этого.

0 голосов
/ 12 июля 2011

Ваша память mgmt кажется выключенной.Предполагая, что 'digits' - это @property, объявленный с атрибутом retain или copy, и вы используете синтезированный сеттер (или написал эквивалентный самостоятельно), тогда вы должны использовать сеттер, как этот:

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

Вы не должны автоматически освобождать старое значение или сохранять новое, так как установщик сделает это за вас.

Если вы хотите вместо этого использовать NSMutableString, вы можете вручную инициировать уведомления KVO, например, так:

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

Надеюсь, это поможет.

...