是否可以在iOS中使用KVC将值设置为只读属性?

时间:2015-11-12 17:45:26

标签: ios objective-c readonly-attribute

我想在这里描述我的困惑。如果这个问题需要修改,请告诉我。

Accordind to Apple documentaition: Reference for readonly property -

Apple documentation link

因此我们无法将值设置为只读属性,因为它的setter不会被创建。 但是我已经创建了一个用于测试它的演示项目。我正在和你分享我的代码示例。

这是" 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];
}

输出是:

Console output

我不知道为什么内存在NSMutableArray中被分配,即使它只是readonly。 为什么字符串会添加到此只读数组中。

我使用KVC使用NSString进行了内存分配测试并获得了相同的结果。使用KVC将值设置为只读字符串。

这是我对readonly属性的setValue的困惑。

所以我误解了一些关于readonly财产的事情?或者还有其他事情发生了?

1 个答案:

答案 0 :(得分:10)

您引用的文档专门讨论了 setter方法。这跟KVC不一样。 KVC默认情况下为enter image description here,如果它找不到要调用的setter方法。因此,readonly会抑制setter方法的合成,但这并不能阻止KVC。

您可以通过将类accessInstanceVariablesDirectly设置为NO来关闭此功能(KVC能够直接转到实例变量),但默认值为YES。