iOS中respondsToSelector与conformsToProtocol的相关理解和使用
ios 理解 相关 使用
2023-09-11 14:17:56 时间
respondsToSelector相关的方法: -(BOOL) isKindOfClass: classObj 用来判断是否是某个类或其子类的实例 -(BOOL) isMemberOfClass: classObj 用来判断是否是某个类的实例 -(BOOL) respondsToSelector: selector 用来判断是否有以某个名字命名的方法(被封装在一个selector的对象里传递) +(BOOL) instancesRespondToSelector: selector 用来判断实例是否有以某个名字命名的方法. 和上面一个不同之处在于, 前面这个方法可以用在实例和类上,而此方法只能用在类上. -(id) performSelector: selector SEL sel = @selector (start:) ; // 指定action if ([obj respondsToSelector:sel]) { //判断该对象是否有相应的方法 [obj performSelector:sel withObject:self]; //调用选择器方法 } 使用[[UIApplication sharedApplication] keyWindow]查找应用程序的主窗口对象respondsToSelector判断是否实现了某方法 #import @interface Tester : NSObject { } -(void) test:(NSString*) msg; -(void) notImp; @end Tester.m #import "Tester.h" @implementation Tester -(void) test:(NSString*) msg { NSLog(@"%@", msg); } @end 注意:没有实现notImp方法 main.m #import #import "Tester.h" int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; id tester = [[Tester alloc] init];//注意,这里使用id SEL testSelector = @selector(test:); SEL notImpSelector = @selector(notImp:); if([tester respondsToSelector:testSelector]) { //tester.m中实现了test方法 [tester test:@"invoke test method"]; } if([tester respondsToSelector:notImpSelector]) { //test.m中没有实现此主就去 [tester notImp]; } [pool drain]; return 0; } conformsToProtocol:@protocol()是用来检查对象是否实现了指定协议类的方法 //例子如下,在例子当中会有适当的注释,以助理解这个方法: @protocol MyProtocol - (void) doSomething; @end @interface MyClass : NSObject//直接符合协议的类 { } @end @implementation MyClass - (void) doSomething { } @end @interface MyOtherClass : MyClass//继承了符合协议的类,即其父类符合协议。 { } @end @implementation MyOtherClass - (void) doSomething { } @end int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; MyClass *obj_one = [MyClass new]; BOOL one_conforms = [obj_one conformsToProtocol:@protocol(MyProtocol)]; MyOtherClass *obj_two = [MyOtherClass new]; //obj_two是类的实例对象,和父类相关,其父类符合协议,则其亦符合。 BOOL two_conforms = [obj_two conformsToProtocol:@protocol(MyProtocol)]; NSLog(@"obj_one conformsToProtocol: %d", one_conforms);//output:YES NSLog(@"obj_two conformsToProtocol: %d", two_conforms);//output:YES [pool drain]; return 0; } //Output: obj_one conformsToProtocol: 1 obj_two conformsToProtocol: 1 //Whereas: MyOtherClass *obj_two = [MyOtherClass new]; //class_conformsToProtocol是只检查当前类符不符合协议,和其父类无关。 BOOL conforms_two = class_conformsToProtocol([obj_two class], @protocol(MyProtocol)); NSLog(@"obj_two conformsToProtocol: %d", conforms_two);//output:NO //Output: obj_two conformsToProtocol: 0 在代理调用是,检查其代理是否符合协议,或者使用 respondsToSelector 检查对象能否响应指定的消息, 是避免代理在回调时因为没有实现代理函数而程序崩溃的一个有效的方式
相关文章
- iOS extern 和 #define 使用
- IOS WebView控件详解
- 使用Xcode 7 beta免费真机调试iOS应用程序
- 《iOS 9 开发指南》——第1章,第1.1节IOS开发入门
- iOS开发:AVPlayer实现流音频边播边存
- iOS开发UI篇—ios应用数据存储方式(归档)
- iOS开发-21UINavigationController导航控制器初始化 导航控制器栈的push和pop跳转理解
- iOS 仿支付宝密码支付
- [其它]iOS 12.2支持电信VoLTE了,中国电信教你如何开通:只要三步
- 深入理解 iOS Rendering Process
- iOS刨根问底-深入理解RunLoop
- iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总
- IOS_ios逆向工程-静态分析
- 【iOS 7】使用UIScreenEdgePanGestureRecognizer实现swipe to pop效果
- ios学习之旅---c语言函数
- 将iOS软件移植到Windows 10的桥梁将很快打通
- iOS GCD使用
- IOS开发--UI进阶之iCarousel学习(待翻译)
- iOS之UI--使用SWRevealViewController实现侧边菜单功能详解实例
- iOS之应用程序国际化