performselector(关于performSelector调用和直接调用有什么不同)
本文目录
- 关于performSelector调用和直接调用有什么不同
- ios performselector 和 respondstoselector的区别
- ios performselector:withobject:withobject:怎么解决
- ios performselector怎么传多个参数
- 关于performSelector,怎么带参数
- performSelector返回值的问题
- 请教个performselector延时执行的问题问题
关于performSelector调用和直接调用有什么不同
1. 有一点是肯定的, performSelector是运行时系统负责去找函数/方法的,在编译时候不做任何校验;但是直接调用肯定在编译是会校验。如果test2不存在,那么直接调用 在编译时候就能够发现(借助Xcode可以写完就发现),但是使用performSelector的话一定是在运行时候才能发现(此时程序崩溃)Cocoa支持在运行时 向某个类添加方法(应该极少人用到, 即方法编译时不存在,但是运行时候存在,这时候必然需要使用performSelector去调用)大概这也是为什么写delegate的时候,为保证程序健壮性,会使用如下函数检验- (BOOL)respondsToSelector:(SEL)aSelector;
ios performselector 和 respondstoselector的区别
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 (, @protocol(MyProtocol)); NSLog(@"obj_two conformsToProtocol: %d", conforms_two);//output:NO //Output: obj_two conformsToProtocol: 0 在代理调用是,检查其代理是否符合协议,或者使用 respondsToSelector 检查对象能否响应指定的消息, 是避免代理在回调时因为没有实现代理函数而程序崩溃的一个有效的方式
ios performselector:withobject:withobject:怎么解决
必须保证调用performSelector:withObject:afterDelay:是在主线程中。但没有测试在子线程中再创建个NSTimer用来延迟,应该也可以,反正直接用是不行的。特实现- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay方法,保证在主线程中调用成功// NSObject_performSelectorEx.h@interface NSObject (performSelectorEx)- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay;@end// NSObject_performSelectorEx.m#import "NSObject_performSelectorEx.h"@implementation NSObject (performSelectorEx)- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay{ NSMethodSignature *sig = ; if (!sig) { return; } NSInvocation *invo = ; ; ; ; ; NSMethodSignature *sigMT = ; NSInvocation *invoMT = ; ; ; SEL arg1 = @selector(invoke); void *arg2 = nil; NSTimeInterval arg3 = delay; ; ; ; ; ;}@end
ios performselector怎么传多个参数
在NSObject.h可以看到- (id)performSelector:(SEL)aSelector;- (id)performSelector:(SEL)aSelector withObject:(id)object;- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;这个方法最多传递两个id类型的参数。题主你可以换个思路,将参数包装成一个模型,这样一个模型就可以囊括所有的参数.
关于performSelector,怎么带参数
方法如下:-(void)singleTap{NSLog(@"Tap 1 time");}-(void)doubleTap{NSLog(@"Tap 2 time");}- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {UITouch *touch = ;NSTimeInterval delaytime = 0.4;//自己根据需要调整switch (touch.tapCount) {case 1:;break;case 2:{;;}break;default:break;}}
performSelector返回值的问题
LZ理解错了吧,anObject与返回值没有关系,是一个可带可不带的参数,这个必须是NSObject的对象,不能是一个简单值,也可是是nil,这与你要perform的selector有关系,如果selector是需要带参数类型的,anObject必须符合你所带的参数类型。而且selector的返回值必须是void吧。
请教个performselector延时执行的问题问题
实际上是performSelector延时调用的问题,经查找资料,performSelector关于内存管理的执行原理是这样的执行 ; 的时候,系统会将tableLayer的引用计数加1,执行完这个方法时,还会将tableLayer的引用计数减1,而在我的游戏里这个延时执行函数是被多次调用的,有时切换场景时延时函数已经被调用但还没有执行,这时tableLayer的引用计数没有减少到0,也就导致了切换场景dealloc方法没有被调用,出现了内存泄露。所以最后我的解决办法就是取消那些还没有来得及执行的延时函数,代码很简单:当然你也可以一个一个得这样用:加上了这个以后,切换场景也就很顺利地执行了dealloc方法,至此问题解决! 最后在找资料时也发现了,延时调用实现长按钮的实现思路,记录下来以备后用:在touchBegan里面然后在end 或cancel里做判断,如果时间不够长按的时间调用:取消began里的方法 最后最后总结:performSelector是一个很有用的函数,跟它打过不少交道,经过血与泪的教训,总结一下它的使用如下:使用前先检测一下,SEL testSelector = @selector(test:); if() { //如果响应就执行 ; }使用后,如果有必要,需要显示的调用cancelPreviousPerformRequestsWithTarget:selector:object: ,否则有可能产生内存泄露,而且这种内存泄露很难发现,因为它并不违反任何规则,所以一定要注意!
更多文章:
苹果手机id密码忘了怎么办验证失败(苹果ID 密码忘了邮箱验证显示无法验证怎么弄安全问题也忘了)
2023年12月31日 14:15
华为ec6109u免拆机刷机(谁能大公无私的发挥精神,把华为EC6109u 的刷机包分享出来)
2024年6月16日 03:40
红米note12参数配置与价格(红米note12pro参数配置)
2024年6月13日 16:40
三星s5可以刷的最高系统(三星s5可以升级为安卓7.0系统吗)
2023年6月19日 05:41
印度手机品牌(OPPO、VIVO在印度受阻,如何打破这一局面)
2023年6月29日 23:00
apple 官网入口(苹果官网在哪里登录 哪里注册ID http://www.apple.com.cn/)
2023年12月25日 18:40
诺基亚 60(诺基亚的操作系统Series 60是什么意思)
2024年5月2日 03:05
朵唯d12手机参数(朵唯D2这部手机如何详细介绍功能,分析率,等)
2024年4月6日 08:55
小米6复刻版发布时间(小米小屏旗舰曝光,上下折叠,后置副屏)
2024年6月3日 05:34
iphone红色特别版有什么意义(iPhone 7手机的红色版与普通版有什么区别)
2023年12月19日 18:10
360n5手机换电池视频(360n5手机当电量剩余15%时几秒钟就自动息屏,(在不看视频不碰手机的情况下),有解决方法吗)
2023年6月7日 12:50
iphone4黑色(我刚新买的iPhone4 黑色型号是MD128 CH/A ,IMEL 013677004335626,是否为真机子)
2023年10月6日 05:55