Можно ли установить значение свойства только для чтения с помощью KVC в iOS?

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

Согласно документации Apple: Ссылка на свойство только для чтения -

ссылка на документацию Apple

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

Это класс ModelTest1.h. Он имеет свойство только для чтения.

#import <Foundation/Foundation.h>

@interface ModelTest1 : NSObject

@property (readonly) NSMutableArray  *arrTest;

@end

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

- (void)readonlyTest
{
    ModelTest1  *obj1 = [ModelTest1 new];

    NSLog(@"obj1.arrTest before = %@",obj1.arrTest);

    [obj1 setValue:[NSMutableArray new] forKey:@"arrTest"];

    NSLog(@"obj1.arrTest after = %@",obj1.arrTest);

    [obj1.arrTest addObject:@"Str 1"];

    NSLog(@"obj1.arrTest after 2 = %@",obj1.arrTest);

    [obj1 release];
}

Выход:

Консольный вывод

Я не понимаю здесь ничего, почему память выделяется в NSMutableArray, даже если она доступна только для чтения. И почему строка добавляется в этот массив только для чтения.

Я провел этот тест выделения памяти с помощью NSString, также используя KVC, и получил тот же результат. Значение было установлено как строка только для чтения с использованием KVC.

Это мое замешательство относительно setValue для свойства только для чтения.

Итак, я что-то неправильно понял о свойстве только для чтения? или что-то еще происходит?


person Mohd Haider    schedule 12.11.2015    source источник


Ответы (1)


В цитируемой вами документации конкретно говорится о методе установки. Это не то же самое, что KVC. KVC, по умолчанию, устанавливает базовую переменную экземпляра напрямую, если не может найти метод установки для вызова. Итак, readonly подавляет синтез метода установки, но это не останавливает KVC.

Вы можете отключить эту функцию (способность KVC переходить прямо к переменной экземпляра), установив для accessInstanceVariablesDirectly класса значение NO, но по умолчанию установлено значение YES.

person matt    schedule 12.11.2015
comment
Спасибо Мэтт за такой быстрый ответ. Это проясняет мое замешательство. Еще раз спасибо! - person Mohd Haider; 12.11.2015
comment
Пожалуйста. Ваша мысль довольно громко упоминается в моей книге: apeth.com/iOSBook/ch12 .html#_key_value_coding_2 - person matt; 12.11.2015
comment
Я просмотрел вашу книгу и должен сказать, что она действительно впечатляет. Обязательно изучу. Спасибо! - person Mohd Haider; 13.11.2015