内省
2018-02-07 本文已影响7人
y2015
内省(Introspection)是面向对象语言和环境的重要特性,Objective-C和Cocoa在这方面做的很好。内省是对象自己检查自己做为运行时对象详细信息的一种能力。这些详细信息包括对象在继承树上的位置,对象是否遵循特定的协议,以及是否可以响应特定的消息。NSObject协议和类定义了很多内省方法,用于查询运行时信息,以便根据对象的特征进行识别。
灵活的使用内省能力可以让你的程序更稳定强大。内省可以避免错误地进行消息派发、对象相等的错误判断等问题。下面介绍内省的一些实用方法:
//返回实例变量的Class对象,与 + (Class)class 相同。
- (Class)class
//实例变量父类Class对象
@property (readonly) Class superclass;
//检查对象是否是那个类或者其继承类实例化的对象
- (BOOL)isKindOfClass:(Class)aClass;
//检查对象是否是那个类但不包括继承类而实例化的对象
- (BOOL)isMemberOfClass:(Class)aClass;
//检查对象是否符合协议,是否实现了协议中所有的必选方法。
- (BOOL)conformsToProtocol:(Protocol *)aProtocol;
//检查对象是否包含这个方法
- (BOOL)respondsToSelector:(SEL)aSelector;
//判断一个实例不继承自NSObject,如果返回NO就是继承自NSObject,反之返回YES
- (BOOL)isProxy;
//返回对象对应哈希值
@property (readonly) NSUInteger hash;
//检查两个对象是否相等
- (BOOL)isEqual:(id)object;
两个对象比较是否相等(注意与==区别,本体性与相等性,NSObject直接比较指针(本体性),若子类要比较,则需重写该方法。
如果你写的子类还需要添加到集合类型(NSDictionary,NSSet等)中去,hash方法也需要重写, 详情看isEqual、==的区别, hash用法