gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 04:21:59 25 4
gpt4 key购买 nike

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

根据 Apple 文档: Reference for readonly property -

Apple documentation link

所以我们不能将值设置为 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];
}

输出是:

Console output

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

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

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

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

最佳答案

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

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

关于ios - 是否可以在 iOS 中使用 KVC 将值设置为只读属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33677909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com