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

Posted

技术标签:

【中文标题】是否可以在 iOS 中使用 KVC 将值设置为只读属性?【英文标题】:Is it possible to set value to readonly property using KVC in iOS? 【发布时间】:2015-11-12 17:45:26 【问题描述】:

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

根据 Apple 文档:

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

输出是:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

感谢马特如此迅速的反应。它消除了我的困惑。再次感谢! 不客气。你提出的观点在我的书中非常响亮:apeth.com/iosBook/ch12.html#_key_value_coding_2 我看了你的书,我必须说它真的令人印象深刻。我肯定会研究它。谢谢!

以上是关于是否可以在 iOS 中使用 KVC 将值设置为只读属性?的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发系列-UI基础-KVC

iOS核心笔记—KVC机制

无法使用 Ucanaccess 3.0.6 将值插入 access 97。它显示访问是只读的

IOS中Key-Value Coding (KVC)的使用具体解释

为啥在js取消设置只读标签后iOS不显示键盘输入?

iOS开发中KVCKVO简介