objective-c中提供了很好的类型判断以及反射机制。oc的基础是c语言,所有的对象都使用指针来表示。一个指针的传递过程中可能模糊掉其实际的类型信息。通过类型查询可以帮助解决很多编程过程中的问题。另外,oc中的方法调用是基于消息的。查询某个类型是否包含一个消息的响应也是一个常用的功能。
例如,在进行http网络通信过程中,获得一个NSURLRequest对象。在需要进行头部信息写入的时候需要查询它是否是mutableRequest:
if([req isMemberOfClass:[NSMutableURLRequest class]])
或者
if([req isKindOfClass:[NSMutableURLRequest class]])
这两种写法的区别在于:
1. isMemberOfClass在类型完全相同的情况下返回true。如果instance是类型的子类,则返回false。
2. isKindOfClass包含子类的判断。
获取一个NSURLResponse,如果要读取响应头的字段,首先要判断其是否包含了allHeaderFields方法:
if([response responsesToSelector:@selector(allHeaderFields)])
也可以写
if([[response class] instancesRespondToSelect:@selector(allHeaderFields)]).
如果需要知道实例是否实现了某个接口,则使用:
if([request conformsToProtocol:NSProtocolFromString(@"NSCopying")])