我想测试一个对象在iPhone SDK中是否有可写的@property.

一种可能的方法是判断-valueForKey:method,但这似乎很不雅观!

例子:

  @try {
    id *value = [instance valueForKey:@"myProperty"];
  }
  @catch (NSException * e) {
    // Key did not exist
  }

有更好的方法吗?

推荐答案

如果要创建要判断的对象,可以重写valueForUndefinedKey:setValue:forUndefinedKey,以执行比引发异常更有用的操作.

另一方面,如果您试图在运行时内省不知道的对象,则必须使用运行时方法来实现这一点.您可以使用Objut-C运行时本身,并调用class_copyPropertyListprotocol_copyPropertyList,并处理这些,或者在KVC吸收器/设置器上为对象提供基础和调用respondsToSelector,例如,对于属性foo,您可以调用类似于[someObject respondsToSelector:NSSelectorFromString(@"foo")];的属性.

Objective-c相关问答推荐

iOS 7 表格视图无法自动调整内容插入

UITableViewCell 突出显示时使标签的背景清晰

UITableView 无限滚动

如何获取 NSArray 的最后一个对象

Iphone,获取 NSArray 中的国家/地区列表

在Objective-C中从类名的NSString创建对象

Grand Central Dispatch (GCD) 与 performSelector - 需要更好的解释

检测代码是否在 Objective-C 的主线程上运行的正确方法是什么? (iOS)

dispatch_async(dispatch_get_main_queue(), ^{...});等到完成?

无法访问 dispatch_async 中的全局变量:变量不可赋值(缺少 _block 类型说明符)

UIFont 的磅值到底是多少?

Objective-C 中的 super 到底是什么?

'supportedInterfaceOrientations' 实现中的返回类型冲突: - 警告

判断 NSString 是否仅包含字母数字 + 下划线字符

在 switch 语句中使用 NSString

cellForRowAtIndexPath 是如何工作的?

Objective-c 协议前向声明

Xcode - 如何将 XIB 连接到 ViewController 类

如何实现全局 iPhone 异常处理?

Xcode 在调试时判断表达式