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: ,否则有可能产生内存泄露,而且这种内存泄露很难发现,因为它并不违反任何规则,所以一定要注意!
更多文章:
nvsvc32(更新完显卡驱动有nvsvc32进程,关掉和不关哪个好)
2024年4月23日 04:05
图表系统组建失败(win7 进dnf图表系统组建失败 玩不了)
2024年6月14日 23:44
实况足球8王者之心(请教实况8王者之心的补丁怎么样安装,不会啊~)
2024年1月26日 19:10
极品飞车13手机版(安卓版极品飞车13配置要求是什么金星 S602的配置能不能玩 玩过的来!!!)
2024年10月3日 01:15
uc浏览器9 0(手机UC浏览器九点零可以扫描条码、二维码吗如果可以,如何用)
2024年1月12日 23:20
梦幻西游墨家剧情(请问120级的墨家村的剧情是怎么过的要杀多少个怪难不难杀回答者请答清楚一点..梦幻西游)
2024年8月2日 04:15
原神2 8金苹果群岛怎么解锁(原神黄金岛地图怎么解锁 原神黄金岛地图如何解锁)
2024年7月6日 07:35