The Foundation Framework NSObject APIs include numerous methods for performing object introspection. These methods dynamically query the runtime for the following types of information:
- Information about methods
- Testing object inheritance, behavior, and conformance
Because Objective-C defers much of its behaviors to the runtime, rather than compile or link time, object introspection can be a critical capability to help you avoid runtime errors such as message-dispatch errors, erroneous assumptions of object equality, and other problems.
The following statement uses the NSObject isKindOfClass: method to test whether the receiver of a message is an instance of the Calculator class or an instance of any class that inherits from the Calculator class.
BOOL isCalculator = [myObject isKindOfClass: [Calculator class]];
The next statement checks whether an object responds to a selector; that is, whether it implements or inherits a method that can respond to a specified message.
BOOL responds = [myObject respondsToSelector:@selector(sumAddend1::)];
The next statement checks whether an object conforms to a given protocol.
BOOL conforms = [myObject conformsToProtocol:@protocol(MyProtocol)];
The following statement obtains the method signature for a selector.
NSMethodSignature *signature = [myObject methodSignatureForSelector:@selector(sumAddend1::)];
This is just a sample of the NSObject methods for performing object introspection. In Part 3 of this book, you’ll look at the NSObject APIs in more detail.