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

Is it possible to set value to readonly property using KVC in iOS?

我想在这里描述我的困惑。让我知道这个问题是否需要修改。

根据 Apple 文档:

Apple documentation link

所以我们不能将值设置为只读 属性 因为它 setter 不会被创建。 但是我已经创建了一个演示项目来测试它。我正在与您分享我的代码示例。

这是"ModelTest1.h"class。它有一个只读 属性.

#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 中分配内存,即使它是只读的。 以及为什么要将字符串添加到这个只读数组中。

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

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

那么我是不是对只读有什么误解属性?还是有其他事情发生?

您引用的文档专门讨论了 setter 方法。这与 KVC 不同。 KVC,默认情况下,sets the underlying instance variable directly 如果找不到要调用的 setter 方法。因此,readonly 抑制了 setter 方法的合成,但这并没有阻止 KVC。

您可以通过将 class 的 accessInstanceVariablesDirectly 设置为 NO 来关闭此功能(KVC 直接访问实例变量的能力),但默认值为 YES。