5

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

根据 Apple 文档: 只读属性的参考 -

苹果文档链接

所以我们不能将 value 设置为 readonly 属性,因为它的 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];
}

输出是:

控制台输出

我在这里没有得到一件事,即为什么在 NSMutableArray 中分配内存,即使它是只读的。以及为什么将字符串添加到此只读数组中。

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

这是我对只读属性的 setValue 的困惑。

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

4

1 回答 1

10

您引用的文档专门讨论了setter 方法。这与 KVC 不同。默认情况下,如果 KVC找不到要调用的 setter 方法,则直接设置底层实例变量。因此,readonly抑制了 setter 方法的合成,但这并不能阻止 KVC。

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

于 2015-11-12T18:05:49.577 回答