Objective-C的內(nèi)省(Introspection)用法小結(jié)
內(nèi)?。↖ntrospection)是面向?qū)ο笳Z言和環(huán)境的一個(gè)強(qiáng)大特性,Objective-C和Cocoa在這個(gè)方面的表現(xiàn)尤其的優(yōu)秀。內(nèi)省是對(duì)象揭示自己作為一個(gè)運(yùn)行時(shí)對(duì)象的詳細(xì)信息的一種能力。這些詳細(xì)信息包括對(duì)象在繼承樹上的位置,對(duì)象是否遵循特定的協(xié)議,以及是否可以響應(yīng)特定的消息等等。NSObject協(xié)議和類定義了很多內(nèi)省方法,用于查詢運(yùn)行時(shí)信息,以便根據(jù)對(duì)象的特征進(jìn)行識(shí)別。
恰當(dāng)?shù)厥褂脙?nèi)省可以使面向?qū)ο蟮某绦蜻\(yùn)行更加高效和強(qiáng)壯。也有助于避免錯(cuò)誤地進(jìn)行消息派發(fā)、錯(cuò)誤地假設(shè)對(duì)象相等。
下面的部分舉例介紹如何在代碼中有效地使用NSObject的內(nèi)省方法。
1、isKindOfClass:Class
檢查對(duì)象是否是那個(gè)類或者其繼承類實(shí)例化的對(duì)象
2、isMemberOfClass:Class
檢查對(duì)象是否是那個(gè)類但不包括繼承類而實(shí)例化的對(duì)象
示例:
Objective-c代碼如下:
if ([item isKindOfClass:[NSData class]]) { const unsigned char *bytes = [item bytes]; unsigned int length = [item length]; // ... }
如果item是NSMutableData類實(shí)例化的對(duì)象,而該類是NSData類的子類,那么[item isKindOfClass:[NSData class]]的值也是TRUE,而[item isMemberOfClass:[NSData class]]的值則為False。
如果item是NSData類實(shí)例化的對(duì)象,那么[item isMemberOfClass:[NSData class]]的值則為TRUE。
3、respondToSelector:selector
檢查對(duì)象是否包含這個(gè)方法
Objective-c代碼如下:
- (void)doCommandBySelector:(SEL)aSelector { if ([self respondsToSelector:aSelector]) { [self performSelector:aSelector withObject:nil]; } else { [_client doCommandBySelector:aSelector]; } }
4、conformsToProtocol:protocol
檢查對(duì)象是否符合協(xié)議,是否實(shí)現(xiàn)了協(xié)議中所有的必選方法。
Objective-c代碼如下:
// ... if (!([((id)testObject) conformsToProtocol:@protocol(NSMenuItem)])) { NSLog(@"Custom MenuItem, '%@', not loaded; it must conform to the 'NSMenuItem' protocol.\n", [testObject class]); [testObject release]; testObject = nil; }
- Swift、Objective-C、Cocoa混合編程設(shè)置指南
- Swift調(diào)用Objective-C編寫的API實(shí)例
- 在Swift中使用Objective-C編寫類、繼承Objective-C類
- Objective-C中常用的結(jié)構(gòu)體NSRange,NSPoint,NSSize(CGSize),NSRect實(shí)例分析
- 在一個(gè)項(xiàng)目中同時(shí)使用Swift和Objective-C代碼混合編程的方法
- Objective-c代碼如何移植為Swift代碼 Objective-c代碼轉(zhuǎn)移到Swift過程介紹
- Objective-C封裝字符串存儲(chǔ)操作示例
- Objective-C 消息傳遞機(jī)制詳解
- objective-c中生成隨機(jī)數(shù)的方法
相關(guān)文章
基于C語言實(shí)現(xiàn)簡(jiǎn)單的掃雷游戲
這篇文章主要為大家詳細(xì)介紹了基于C語言實(shí)現(xiàn)簡(jiǎn)單的掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10C/C++ Qt 數(shù)據(jù)庫與Chart歷史數(shù)據(jù)展示
這篇文章主要介紹了Qt利用Qchart組件展示數(shù)據(jù)庫中的歷史數(shù)據(jù)。文中的示例代碼講解清晰,具有一定的學(xué)習(xí)和工作價(jià)值,感興趣的小伙伴可以學(xué)習(xí)一下2021-12-12C++數(shù)據(jù)結(jié)構(gòu)之搜索二叉樹的實(shí)現(xiàn)
了解搜索二叉樹是為了STL中的map和set做鋪墊,我們所熟知的AVL樹和平衡搜索二叉樹也需要搜索二叉樹的基礎(chǔ)。本文將詳解如何利用C++實(shí)現(xiàn)搜索二叉樹,需要的可以參考一下2022-05-05C++ 網(wǎng)絡(luò)連通性檢測(cè)的實(shí)現(xiàn)方法
這篇文章主要介紹了C++ 網(wǎng)絡(luò)連通性檢測(cè)的實(shí)現(xiàn)方法的相關(guān)資料,這里提供實(shí)例幫助大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-09-09詳解C++?functional庫中的仿函數(shù)使用方法
仿函數(shù)(functor)又稱之為函數(shù)對(duì)象(function?object),實(shí)際上就是?重載了()操作符?的?struct或class。本文將詳細(xì)講解C++中仿函數(shù)的使用方法,需要的可以參考一下2022-04-04詳解C語言中for循環(huán)與while循環(huán)的用法
這篇文章主要通過幾個(gè)示例為大家介紹一下C語言中for循環(huán)與while循環(huán)的用法以及二者的區(qū)別,文中的代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C語言有一定幫助,需要的可以參考一下2022-07-07數(shù)據(jù)結(jié)構(gòu)之AVL樹詳解
這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)之AVL樹詳解,本文非常細(xì)致的講解了AVL樹的基礎(chǔ)知識(shí)、AVL樹的旋轉(zhuǎn)操作、AVL數(shù)的插入和刪除操作等,需要的朋友可以參考下2014-08-08