Objective-C的內省(Introspection)機制

     內省(Introspection)是面嚮對象語言和環境的一個強大特性,Objective-C和Cocoa在這個方面尤其的豐富。內省是對象揭示自己作爲一個運行時對象的詳細信息的一種能力。這些詳細信息包括對象在繼承樹上的位置,對象是否遵循特定的協議,以及是否可以響應特定的消息。NSObject協議和類定義了很多內省方法,用於查詢運行時信息,以便根據對象的特徵進行識別。


明智地使用內省可以使面向對象的程序更加高效和強壯。它有助於避免錯誤地進行消息派發、錯誤地假設對象相等、以及類似的問題。

下面的部分將介紹如何在代碼中有效地使用NSObject的內省方法。

 

1、isKindOfClass:Class

檢查對象是否是那個類或者其繼承類實例化的對象


2、isMemberOfClass:Class

檢查對象是否是那個類但不包括繼承類而實例化的對象


示例:

Objective-c代碼  收藏代碼
  1. if ([item isKindOfClass:[NSData class]]) {  
  2.     const unsigned char *bytes = [item bytes];  
  3.     unsigned int length = [item length];  
  4.     // ...  
  5. }  
 

如果item是NSMutableData類實例化的對象,而該類是NSData類的子類,那麼[item isKindOfClass:[NSData class]]的值也是TRUE,而[item isMemberOfClass:[NSData class]]的值則爲False。
如果item是NSData類實例化的對象,那麼[item isMemberOfClass:[NSData class]]的值則爲TRUE。



3、respondToSelector:selector

檢查對象是否包含這個方法


Objective-c代碼  收藏代碼
  1. - (void)doCommandBySelector:(SEL)aSelector {  
  2.     if ([self respondsToSelector:aSelector]) {  
  3.         [self performSelector:aSelector withObject:nil];  
  4.     } else {  
  5.         [_client doCommandBySelector:aSelector];  
  6.     }  
  7. }  
 

4、conformsToProtocol:protocol

檢查對象是否符合協議,是否實現了協議中所有的必選方法。

Objective-c代碼  收藏代碼
  1. // ...  
  2. if (!([((id)testObject) conformsToProtocol:@protocol(NSMenuItem)])) {  
  3.     NSLog(@"Custom MenuItem, '%@', not loaded; it must conform to the  
  4.         'NSMenuItem' protocol.\n", [testObject class]);  
  5.     [testObject release];  
  6.     testObject = nil;  
  7. }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章