gpt4 book ai didi

objective-c - 测试只读属性与设置/获取键 -- obj-c/cocoa

转载 作者:搜寻专家 更新时间:2023-10-30 19:52:00 26 4
gpt4 key购买 nike

如果我只有一个键列表,是否有一种优雅的方法来测试对象的只读属性和读/写属性?我意识到我可以敲击 key :

NSString *setterString = [@"set" stringByAppendingString:[someKeyString capitalizedString]];
BOOL isReadWrite = [myObject respondsToSelector:NSSelectorFromString(setterString)];

或者更好的是尝试为键设置一个值并检查 NSUndefinedKeyException - 但对非异常行为使用异常似乎是一种糟糕的形式。

明确地说,我想以编程方式审核一个对象的属性,并区分它们之间的区别,例如,

@property (readonly) NSString *someReadOnlyKey
@property NSString *someReadWriteProperty

编辑:为了清楚,键是作为 @property 还是手动 getter/setter 实现的并不重要.只关心公共(public)接口(interface)。并感谢您询问我正在尝试完成什么 - 从一开始就做对可能更重要。

我正在尝试草拟一些代码来生成对象键的图形表示。所有的键都是事先知道的——但我不会总是知道哪些键是可设置的(这取决于特定的子类来实现)

最佳答案

您有两种有效的方法:

  • respondsToSelector: 方法
  • Tommy 的回答中揭示的运行时“技巧”

我将尝试总结这两种方法的含义及其缺点。然后,您可以选择更适合您需求的方法。

案例一

//MyClass.h

@property (readonly) NSString *someReadOnlyKey;
  • 运行时 => 只读
  • respondsToSelector =>

好的,一切正常。

案例2

//MyClass.h

@property (readonly) NSString *someReadOnlyKey;

///////////////////////////////////////////////////////////////////////////

//MyClass.m

@property (readwrite) NSString *someReadOnlyKey;
  • 运行时 => 读写
  • respondsToSelector =>

如果属性定义已被覆盖,您将获得正在使用的实际 属性。无论您是从 setter 可见的地方(即在类定义内部还是从外部)查询它,都没有关系。您将获得用于合成访问器方法的实际定义。

案例三

//MyClass.h

@property (setter=myCoolSetter) NSString *someReadOnlyKey;
  • 运行时 => 读写
  • respondsToSelector =>

使用自定义 setter 名称,respondsToSelector 技巧将不再起作用,而运行时仍会提供正确的信息。

案例4

//MyClass.h

@property (readonly) NSString *someReadOnlyKey;

///////////////////////////////////////////////////////////////////////////

//MyClass.m

- (void)setSomeReadOnlyKey:(NSString *)someReadOnlyKey {
_someReadOnlyKey = someReadOnlyKey;
}
  • 运行时 => 只读
  • respondsToSelector =>

这次运行时失败了,因为 setter 在那里,但属性定义“不知道”它。

关于objective-c - 测试只读属性与设置/获取键 -- obj-c/cocoa,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18455020/

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