前言
主要記錄一下respondsToSelector方法與instancesRespondToSelector方法的區(qū)別,對于很多人來說,平時使用得也比較多,但是可能會對這兩個方法的使用弄混淆,希望寫在這里對一些同學(xué)可以起到一些幫助。
結(jié)論
respondsToSelector方法
- 本身是一個
實(shí)例方法
- (BOOL)respondsToSelector:(SEL)aSelector;
- 用于
class調(diào)用(class本身也是一個對象)
判斷class是否實(shí)現(xiàn)了相應(yīng)的類方法。
- 用于
object調(diào)用
判斷實(shí)例對象是否實(shí)現(xiàn)了相應(yīng)的實(shí)例方法。
instancesRespondToSelector方法
- 本身是一個
類方法
+ (BOOL)instancesRespondToSelector:(SEL)aSelector;
- 只能用
類來調(diào)用,不能用實(shí)例對象來調(diào)用
判斷該類的實(shí)例對象是否實(shí)現(xiàn)了相應(yīng)的實(shí)例方法。
實(shí)踐
創(chuàng)建一項(xiàng)新的工程
新建一個類Person, 繼承于NSObject
在Person.h文件中
// Person.h文件
@interface Person : NSObject
+ (void)classMethod:(NSString *)invoker;
- (void)instanceMethod:(NSString *)methodName;
@end
在Person.m文件中
//Person.m文件
@implementation Person
+ (void)classMethod:(NSString *)invoker {
NSLog(@"method: classMethod has implemented!");
}
- (void)instanceMethod:(NSString *)methodName {
NSLog(@"method: instanceMethod has implemented!");
}
@end
在ViewController.m文件中, 先導(dǎo)入Person.h文件
- (void)viewDidLoad {
[super viewDidLoad];
Person *personInstance = [Person new];
if ([personInstance respondsToSelector:@selector(classMethod:)]) {
NSLog(@" - yes - [personInstance respondsToSelector:@selector(classMethod:)]");
} else {
// 被執(zhí)行
NSLog(@" - no - [personInstance respondsToSelector:@selector(classMethod:)]");
}
if ([personInstance respondsToSelector:@selector(instanceMethod:)]) {
// 被執(zhí)行
NSLog(@" - yes - [personInstance respondsToSelector:@selector(instanceMethod:)]");
} else {
NSLog(@" - no - [personInstance respondsToSelector:@selector(instanceMethod:)]");
}
if ([Person respondsToSelector:@selector(classMethod:)]) {
// 被執(zhí)行
NSLog(@" - yes - [PersonClass respondsToSelector:@selector(classMethod:)]");
} else {
NSLog(@" - no - [PersonClass respondsToSelector:@selector(classMethod:)]");
}
if ([Person respondsToSelector:@selector(instanceMethod:)]) {
NSLog(@" - yes - [PersonClass respondsToSelector:@selector(instanceMethod:)]");
} else {
// 被執(zhí)行
NSLog(@" - no - [PersonClass respondsToSelector:@selector(instanceMethod:)]");
}
if ([Person instancesRespondToSelector:@selector(classMethod:)]) {
NSLog(@" - yes - [PersonClass instancesRespondToSelector:@selector(classMethod:)]");
} else {
// 被執(zhí)行
NSLog(@" - no - [PersonClass instancesRespondToSelector:@selector(classMethod:)]");
}
if ([Person instancesRespondToSelector:@selector(instanceMethod:)]) {
// 被執(zhí)行
NSLog(@" - yes - [PersonClass instancesRespondToSelector:@selector(instanceMethod:)]");
} else {
NSLog(@" - no - [PersonClass instancesRespondToSelector:@selector(instanceMethod:)]");
}
}
執(zhí)行結(jié)果
- no - [personInstance respondsToSelector:@selector(classMethod:)] ①
- yes - [personInstance respondsToSelector:@selector(instanceMethod:)] ②
- yes - [PersonClass respondsToSelector:@selector(classMethod:)] ③
- no - [PersonClass respondsToSelector:@selector(instanceMethod:)] ④
- no - [PersonClass instancesRespondToSelector:@selector(classMethod:)] ⑤
- yes - [PersonClass instancesRespondToSelector:@selector(instanceMethod:)] ⑥
結(jié)果分析
① ② 表明 判斷實(shí)例對象是否實(shí)現(xiàn)了實(shí)例方法(instanceMethod:)
③ ④ 表明 判斷類是否實(shí)現(xiàn)了類方法(classMethod:)
⑤ ⑥ 表明 判斷類的實(shí)例對象是否實(shí)現(xiàn)了(instanceMethod:)
寫到最后
遇到這種類似的API,如果有疑問,盡量用代碼去驗(yàn)證,結(jié)果一目了然。