Поиск…


замечания

KVC : - кодирование с ключом

Обычно переменные экземпляра получают доступ через свойства или аксессоры, но KVC дает другой способ доступа к переменным в виде строк. Таким образом, ваш класс действует как словарь, а ваше имя свойства, например, «возраст» становится ключевым, а значение, которое свойство сохраняет, становится значением для этого ключа.

For example, you have employee class with "age" property. Normally we access like this.
emp.age = @”20″;
NSString age = emp.age; 

But KVC works like this: 
[emp valueForKey:@"age"]; 
[emp setValue:@"25" forKey:@"age"];

KVO : - Наблюдатель по ключевым значениям

Механизм, посредством которого объекты уведомляются при изменении какого-либо свойства, называется KVO. Ex.: уведомление о клавиатуре

Например, объект person заинтересован в получении уведомления, когда свойство AccountBalance изменено в объекте BankAccount. Чтобы достичь этого, Person Object должен зарегистрироваться в качестве наблюдателя в свойстве AccountAccount AccountBalance, отправив addObserver: forKeyPath: options: context: message.

Использование контекста для наблюдения KVO

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context

Контекст важен, если вы отправляете свой класс для использования другими пользователями. Контекст позволяет наблюдателю вашего класса проверять, что его вызывающий наблюдатель.

Проблема с пропуском наблюдателя заключается в том, что если какой-то один подкласс вашего класса и зарегистрировать наблюдателя для одного и того же объекта, тот же ключ и он не передает контекст, тогда суперкласс-наблюдатель можно назвать многократным.

Хорошим контекстом является переменная, уникальная и внутренняя для вашего использования.

Для дополнительной информации.

важность и хороший контекст

Наблюдение свойства подкласса NSObject

Большинство функций KVO и KVC уже реализованы по умолчанию во всех подклассах NSObject .

Чтобы начать наблюдать свойство с именем firstName объекта с именем personObject выполните это в классе наблюдения:

[personObject addObserver:self
               forKeyPath:@"firstName"
                  options:NSKeyValueObservingOptionNew
                  context:nil];

Объект, который self в вышеприведенном коде ссылается, затем получит сообщение observeValueForKeyPath:ofObject:change:context: при каждом изменении пути отслеживаемого ключа.

- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary<NSString *,id> *)change
                       context:(void *)context
{
    NSLog(@"new value of %@ is: %@", keyPath, change[NSKeyValueChangeNewKey]);
}

«Ключевой путь» - это термин КВК. Подклассы NSObject реализуют функциональность KVC по умолчанию.

Переменная экземпляра с именем _firstName будет доступна с помощью ключевого пути @"firstName" .

Метод getter с именем firstName будет вызываться при доступе к ключевому пути @"firstName" , независимо от _firstName переменной экземпляра setFirstName или setFirstName .



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow