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)省是對象揭示自己作為一個(gè)運(yùn)行時(shí)對象的詳細(xì)信息的一種能力。這些詳細(xì)信息包括對象在繼承樹上的位置,對象是否遵循特定的協(xié)議,以及是否可以響應(yīng)特定的消息等等。NSObject協(xié)議和類定義了很多內(nèi)省方法,用于查詢運(yùn)行時(shí)信息,以便根據(jù)對象的特征進(jìn)行識(shí)別。
恰當(dāng)?shù)厥褂脙?nèi)省可以使面向?qū)ο蟮某绦蜻\(yùn)行更加高效和強(qiáng)壯。也有助于避免錯(cuò)誤地進(jìn)行消息派發(fā)、錯(cuò)誤地假設(shè)對象相等。
下面的部分舉例介紹如何在代碼中有效地使用NSObject的內(nèi)省方法。
1、isKindOfClass:Class
檢查對象是否是那個(gè)類或者其繼承類實(shí)例化的對象
2、isMemberOfClass:Class
檢查對象是否是那個(gè)類但不包括繼承類而實(shí)例化的對象
示例:
Objective-c代碼如下:
if ([item isKindOfClass:[NSData class]]) {
const unsigned char *bytes = [item bytes];
unsigned int length = [item length];
// ...
}
如果item是NSMutableData類實(shí)例化的對象,而該類是NSData類的子類,那么[item isKindOfClass:[NSData class]]的值也是TRUE,而[item isMemberOfClass:[NSData class]]的值則為False。
如果item是NSData類實(shí)例化的對象,那么[item isMemberOfClass:[NSData class]]的值則為TRUE。
3、respondToSelector:selector
檢查對象是否包含這個(gè)方法
Objective-c代碼如下:
- (void)doCommandBySelector:(SEL)aSelector {
if ([self respondsToSelector:aSelector]) {
[self performSelector:aSelector withObject:nil];
} else {
[_client doCommandBySelector:aSelector];
}
}
4、conformsToProtocol:protocol
檢查對象是否符合協(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)文章
Qt QThreadPool線程池的實(shí)現(xiàn)
QThreadPool管理和重新設(shè)計(jì)單個(gè)QThread對象,以幫助降低使用線程的程序中的線程創(chuàng)建成本,本文主要介紹了Qt QThreadPool線程池的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2007-03-03
OpenCV實(shí)現(xiàn)車牌字符分割(C++)
這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)車牌字符分割,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11

