setNilValueForKey не вызывается в учебном руководстве по Core Data Utility

Учебное пособие по Core Data Utility от Apple рекомендует реализовать setNilValueForKey: и протестировать его действие:

Используйте кодирование "ключ-значение", чтобы установить идентификатор процесса равным нулю. Скомпилируйте и запустите утилиту. Опять же, что происходит? И, наконец, закомментируйте метод setNilValueForKey: и проверьте его еще раз.

Я пытаюсь установить ID процесса равным нулю с помощью этого кода: [run setValue:nil forKey:@"processID"];, но это не вызывает setNilValueForKey:. Почему нет?

Вот моя реализация; добавленный мной оператор NSLog никогда не появляется.

- (void) setNilValueForKey:(NSString*)key {
    NSLog(@"setNilValueForKey: %@",  key) ;
    if ( [key isEqualToString:@"processID"] ) {
        [self setValue:@0  forKey:key ] ;
    }
    else {
        [super setNilValueForKey:key] ;
    }
}

Я нашел похожий стековый поток обсуждения, но никто не ответил на этот вопрос.


person John Sauer    schedule 14.12.2012    source источник


Ответы (1)


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

Если вы предоставляете собственный метод установки для свойства "processID" в "Run.m":

- (void)setProcessID:(NSInteger)processID
{
    [self willChangeValueForKey:@"processID"];
    [self setPrimitiveValue:@(processID) forKey:@"processID"];
    [self didChangeValueForKey:@"processID"];
}

тогда

[run setValue:nil forKey:@"processID"]

вызывает вызов setNilValueForKey:.

Это только то, что я испытал путем попыток и ошибок, у меня нет официальных ссылок на это. Но «Учебное пособие по Core Data Utility» существует с Mac OS X 10.4, где динамически генерируемые методы доступа (насколько мне известно) еще не существовали. Так что может быть, что части о setNilValueForKey: не обновлены для версии 10.5. Но с моей стороны это чистое предположение.

person Martin R    schedule 15.12.2012
comment
Спасибо за отличное объяснение! Я оставлю отзыв через Apple. Этот документ вам помог? Отзыв о документе. - person John Sauer; 15.12.2012
comment
@ghettopia: Пожалуйста. - Также вы можете сообщить об ошибке на bugreport.apple.com, там есть специальная категория «Документация». - person Martin R; 15.12.2012