Если бы я хотел написать свой собственный метод установки, совместимый с KVO, это выглядело бы примерно так? - PullRequest
3 голосов
/ 08 июня 2010
- (void)setFirstName:(NSString*)firstNameValue {
    [self willChangeValueForKey:@"firstName"];
    [firstName release];
    firstName = firstNameValue;
    [firstName retain];
    [self didChangeValueForKey:@"firstName"];
}

Это верно? То есть блок willChange ... foobar didChange ... вызывает срабатывание уведомления KVO?

Ответы [ 2 ]

12 голосов
/ 17 июля 2010

Нет, ваша реализация не на 100% правильная. Подумайте, что произойдет, если для firstName в данный момент задан экземпляр NSString, и установщик вызывается с тем же тем же экземпляром. Сначала вы отпустите экземпляр, затем установите переменную экземпляра, которая в этом случае ничего не изменит, а затем попытаетесь сохранить экземпляр, но к тому времени он уже вполне может быть отменен.

Должно быть:

- (void)setFirstName:(NSString*)firstNameValue {
    [self willChangeValueForKey:@"firstName"];
    [firstNameValue retain];
    [firstName release];
    firstName = firstNameValue;
    [self didChangeValueForKey:@"firstName"];
}

или

- (void)setFirstName:(NSString*)firstNameValue {
    if (firstNameValue != firstName) {
        [self willChangeValueForKey:@"firstName"];
        [firstName release];
        firstName = firstNameValue;
        [firstName retain];
        [self didChangeValueForKey:@"firstName"];
    }
}

Последняя версия имеет дополнительное преимущество, заключающееся в том, что она не отправляет уведомления oberserver, если значение на самом деле не изменилось.

0 голосов
/ 19 июля 2010

Да - вызов didChangeValueForKey: уведомит всех наблюдателей об изменении значения.

...