百科狗-知识改变命运!
--

ios performselector 和 respondstoselector的区别

泡在奶味里1年前 (2023-12-16)阅读数 4#综合百科
文章标签方法协议

respondsToSelector是实例方法也是类方法,用于判断某个类/实例是否能处理某个方法(包括基类方法)。conformsToProtocol:@protocol()是用来检查对象是否实现了指定协议类的方法. 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 performselector 和 respondstoselector的区别

这两种方式有什么区别

1、可以存在项目中,也可以存在Assets中,都可以加载出来

2、适合中小型

3、有缓存

优点:当加载同样一个图标的时候,那么用imageNamed加载图像效率高,因为系统会把那个图标Cache到内存,每次需要这个图像的时候,只会把指针指向同一块内存。

缺点:虽然提高了运行速度,但是非常消耗内存,有些只需加载一次,不会在用了,消耗内存。

1、参数是路径,格式字符串

2、无缓存,根据路径查找

3、适合不常用和比较大的资源

优点:节省内存

缺点:消耗性能

总结 : 一些小的icon可以存在Assets里面.用imageNamed加载. 一些比较大的,使用频率低的可以建立一个bundle存放,使用imageWithContentsOfFile加载.

鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com

免责声明:我们致力于保护作者版权,注重分享,当前被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!邮箱:344225443@qq.com)

图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)