如果 你 用 id类型的变量 来存储 物件,而 id类型的变量本身 可以存储 各种类型的物件,那么 很多时候 你 可能会问 这类的问题:
1、这个物件 属于 XX类型吗?
2、XX这项措施 适用于 这个物件吗?
3、这个物件所属的类别 是 包含 在XX这个类别当中,还是 就是 XX这个类别?
根据 这些问题的答案,你 可以执行 不同的代码,避免 错误,确保 程序的完整性。
下面这个表中的措施 适用于 所有属于NSObject类型的物件,可以帮助 你 搞清楚 上述的这类问题。
措施 | 作用 |
-(BOOL)isKindOfClass:class-object | 检查 措施的实施对象所属的类别 是否是 class类型,或者 包含 在class这个类型当中 |
-(BOOL)isMemberOfClass:class-object | 检查 措施的实施对象所属的类别 是否是 class这个类型 |
-(BOOL)respondsToSelector:selector | 检查 selector所代表的措施 是否适用于 实施对象 |
+(BOOL)instancesRespondToSelector:selector | 检查 selector所代表的措施 是否适用于 属于措施实施者类型的物件(还记得 加号的含义吧?) |
+(BOOL)isSubclassOfClass:class-object | 检查 措施的实施者这类物件 是否包含 在class这类物件当中 |
-(id)performSelector:selector | 实施 selector所代表的措施 |
-(id)performSelector:selector withObject:object | 实施 selector所代表的措施,并且 附带object 作为参数 |
-(id)performSelector:selector withObject:object1 withObject:object2 | 实施 selector所代表的措施,并且 附带 object1 和 object2 作为参数 |
这个表 并不包含 所有的措施。
如果 你 需要根据物件类型的名称 生成 一个物件,你 只需要让 这类物件 采取 class这项措施 就可以了:
这行语句的作用 就是 生成 一个Square类型的物件。
如果 mySquare 是 一个物件的话,那么 你 可以用 class这项措施 知道 mySquare这个物件 属于 哪个类型,就像 这样:
同样的道理,如果 你 要判断 objectOne 和 objectTwo这两个变量中的物件 是否属于 同一个类型,你 只需要用到 下面这行语句:
如果 你 要判断 物件myFraction 是否属于 Fraction这个类型,你 可以用 这样的语句:
在上面的表格当中,我 提到过 selector。selector 可以理解为 措施标志。措施标志 有 两个意思:1、在源代码中,措施标志 就是 措施名称本身;2、在编译 源代码时 措施标志 是 用来代替措施名称的独一无二的标志。措施标志 可以存储 在SEL类型的变量中。
要生成 措施标志,可以使用 @selector命令,并且 将 措施的名称 作为 参数。比如 这行语句
就是 为 alloc这项措施 生成 措施标志。
下面这行语句 是 为 setNumerator:andDenominator:这项措施 生成 措施标志,注意 不能忘记 冒号,因为 这项措施 是 附带参数的:
检查 一项措施 是否适用于 某一类物件,我们 需要让 这类物件 实施instancesRespondToSelector:这项措施,instancesRespondToSelector:这项措施附带的参数 是 措施的标志。比如 这行语句
的作用 就是 检查 setNumerator:andDenominator:这项措施 是否适用于 Fraction类型的物件,而 检查的依据 是 setNumerator:andDenominator:这项措施的标志,而 不是 它本身。
另外 只要知道 一项措施的标志,我们 就可以 对 某个物件 采取 这项措施。在下面这段代码当中
我 创建了 一个SEL类型的变量action,并且 将 draw这项措施的标志 存储 在变量action当中。最后 我 对 graphicObject这个物件 采取了 performSelector:这项措施,并且 将 draw这项措施的标志action 作为参数 传递 给performSelector:这项措施。上述最后一行语句的效果 相当于 这样:
利用 performSelector:这项措施 和 需要实施的措施的标志 可以用来避免 错误:
在这段代码当中,我 先检查 变量action所代表的措施 是否适用于 graphicObject这个物件,如果 适用,则 实施 这项措施;如果 不适用,则 另行 处理。
下面这段程序 及 其运行结果 可以帮助 你 更好地 理解 上面表格中的措施:
运行后,可以得到 这样的结果: