运行时验证对象功能

内省是Objective-C和NSObject类的强大且实用的功能,使您能在运行时了解有关对象的某些东西。您因此可避免代码出错,例如将消息发送到无法识别它的对象,或者误以为对象从一个给定的类继承。

对象会在运行时透露三种重要信息:

  1.它是否是特定类或其子类的实例

  2.它是否响应消息

  3.它是否遵守协议

发现对象是否是特定类或其子类的实例

要发现对象是否是某类或其子类的实例,请在对象上调用 isKindOfClass: 方法。当应用程序需要发现其响应的消息(实现的或继承的),它有时进行以上的检查。

static int sum = 0;

for (id item in myArray) {

<span style="white-space:pre">	</span>if ([item isKindOfClass:[NSNumber class]]) {

<span style="white-space:pre">	</span>  int i = (int)[item intValue];

<span style="white-space:pre">	</span>  sum += i;
<span style="white-space:pre">	</span>}
}

isKindOfClass: 方法将类型为 Class 的对象视为参数;要获取此对象,请在类符号上调用 class 方法。接着评估此方法返回的 Boolean 值,并继续相应的操作。

NSObject 会声明其他方法来发现有关对象继承的信息。例如,isMemberOfClass: 方法告诉您,对象是否是特定类的实例;而 isKindOfClass: 告诉您,对象是否是该类或任何

其后代类的成员。

发现对象是否响应消息

要发现一个对象是否响应一则消息,请在该对象上调用 respondsToSelector: 方法。应用程序代码通常验证一个对象响应一则消息后,才将消息发送给该对象。

if ([item respondsToSelector:@selector(setState:)]){

    [item setState:[self.arcView.font isBold] ?NSOnState :NSOffState];

}

respondsToSelector: 方法将选择器视为其参数。选择器是一种 Objective-C 数据类型,用于方法的运行时标识符 (runtime identifiers);您使用 @selector 编译器指令指定选择器。在您的代码中,评估此方法返回的 Boolean 值,并继续相应的操作。

要识别对象响应的消息,调用 respondsToSelector: 通常比评估类的类型更有用。例如,一个类的较新版本可能实现以前版本没有的方法。

发现对象是否遵守协议
要发现对象是否遵守协议,请在对象上调用 conformsToProtocol: 方法。

if ([item respondsToSelector:@selector(setState:)]){
  [item setState:[self.arcView.font isBold] ?NSOnState :NSOffState];
}

- (void) setDelegate:(id __weak) obj {
  NSParameterAssert([obj conformsToProtocol:
  @protocol(SubviewTableViewControllerDataSourceProtocol)]);
}

delegate = obj;

conformsToProtocol: 方法将协议的运行时标识符视为参数,您使用 @protocol 编译器指令指定此标识符。评估此方法返回的 Boolean 值,并继续相应的操作。

请注意,对象可以遵守协议,而不实现其可选方法。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值