2015-11-12 3 views
5

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

Accordind для компании Apple documentaition: Reference for readonly property -

Apple documentation link

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

Это класс "ModelTest1.h". Он имеет свойство readonly.

#import <Foundation/Foundation.h> 

@interface ModelTest1 : NSObject 

@property (readonly) NSMutableArray *arrTest; 

@end 

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

- (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]; 
} 

Выход:

Console output

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

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

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

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

ответ

10

Документация, которую вы цитируете, касается конкретно метода setter. Это не то же самое, что KVC. KVC, по умолчанию, sets the underlying instance variable directly, если он не может найти метод setter для вызова. Таким образом, readonly подавляет синтез метода сеттера, но это не останавливает KVC.

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

+0

Спасибо матовой за такой быстрый ответ. Это очищает мое замешательство. Еще раз спасибо! –

+1

Добро пожаловать. То, что вы делаете, вызывается довольно громко в моей книге: http://www.apeth.com/iOSBook/ch12.html#_key_value_coding_2 – matt

+0

Я взглянул на вашу книгу, и я должен сказать, что это действительно впечатляет. Я определенно собираюсь изучить его. Благодаря! –