是否可以在 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 将值设置为只读属性?的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 Ucanaccess 3.0.6 将值插入 access 97。它显示访问是只读的