在此我对performSelector系列方法进行了总结 1、 – (id)performSelector:(SEL)aSelector; – (id)performSelector:(SEL)aSelector...withObject:(id)object; – (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2...例如: [self performSelector:@selector(configUI)]; 与[self configUI]; 效果完全相同。...withObject:(id)object 这是要传递的参数 2、 – (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument...afterDelay:(NSTimeInterval)delay inModes:(NSArray *)modes; – (void)performSelector:(SEL)
)sender { dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSLog(@"1"); [self performSelector...afterDelay:0]; NSLog(@"2"); }); } - (void)test { NSLog(@"3"); } 答案是只打印:1、2 因为[self performSelector
看一下以下方法的执行结果: 例1:全局并发队列中执行异步任务 dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSLog(@"1"); [self performSelector...例2:把 async 改成 sync : dispatch_sync(dispatch_get_global_queue(0, 0), ^{ NSLog(@"1"); [self performSelector...如果希望消息能在其他模式下也能出列,可以使用performSelector:withObject:afterDelay:inModes: 代替。...如: [self performSelector:@selector(test) withObject:nil afterDelay:2 inModes:@[NSRunLoopCommonModes]]...3 解决方案2:获取子线程 runloop dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSLog(@"1"); [self performSelector
在ARC项目中使用 performSelector: 函数出现“performSelector may cause a leak because its selector is unknown”这样的警告...而使用 performSelector: 时ARC并不知道该方法的返回值是什么,以及该如何处理?该忽略?...方法一: 这样即可; //#pragma clang diagnostic push //#pragma clang diagnostic ignored "-Warc-performSelector-leaks...(code) \ _Pragma("clang diagnostic push") \ _Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks...参考: 'iOS performSelector may cause a leak' warning performSelector may cause a leak because its selector
当我们在使用以下方法时: [obj performSelector:@selector(play)]; [obj performSelector:@selector(play:) withObject:...unknown 所以在实际开发中,为了避免运行时突然报错找不到方法等问题,少使用performSelector方法。...而performSelector:withObject:afterDelay:其实就是在内部创建了一个NSTimer,然后会添加到当前线程的Runloop中。...在回答完延迟方法之后,会将该方法和performSelector:withObject:作对比,那么performSelector:withObject:在不添加到子线程的Runloop中时是否能执行?...四 多参传递 performSelector如何进行多值传输?
PerformSelector 的实现原理 当调用 NSObject 的 performSelecter:afterDelay: 后,实际上其内部会创建一个 Timer 并添加到当前线程的 RunLoop...当调用 performSelector:onThread: 时,实际上其会创建一个 Timer 加到对应的线程去,同样的,如果对应线程没有 RunLoop 该方法也会失效。...PerformSelector:afterDelay:这个方法在子线程中是否起作用?为什么?怎么解决? 不起作用,子线程默认没有 Runloop,也就没有 Timer。
下面两段代码都在主线程中运行,我们在看别人代码时会发现有时会直接调用,有时会利用performSelector调用,今天看到有人在问这个问题,我便做一下总结, [delegate imageDownloader...:self didFinishWithImage:image]; [delegate performSelector:@selector(imageDownloader:didFinishWithImage...:)withObject:self withObject:image]; 1、performSelector是运行时系统负责去找方法的,在编译时候不做任何校验;如果直接调用编译是会自动校验。...(此时程序崩溃);Cocoa支持在运行时向某个类添加方法,即方法编译时不存在,但是运行时候存在,这时候必然需要使用performSelector去调用。...而使用performSelector时候,可以不用import头文件包含方法的对象,直接用performSelector调用即可。 代码如下: ? ? ? 打印结果: ?
目录 一、NSThread 1、一些类方法 2、创建方式 (1)、alloc init创建,但是需要手动开启 (2)、初始化一个子线程,特点:自动开启,是类方法 (3)、performSelector隐式创建...(顺便说一下performSelector其他方法) 二、performSelector 1、afterDelay在子线程中未执行 2、实现:多次点击, 只执行最后一次 三、需要手动加锁(线程同步)(...detachNewThreadSelector:@selector(network:) toTarget:self withObject:@{@"name":@"moxiaohui"}]; } (3)、performSelector...隐式创建 (顺便说一下performSelector其他方法) 二、performSelector // 当前线程中执行 [self performSelector:@selector(network...:) withObject:@{@"name":@"moxiaohui"}]; // 同步 [self performSelector:@selector(network:) withObject:
本文希望介绍一个特殊的 预处理指令 #pragma clang poison ,该指令可以实现禁止调用 performSelector: 方法的诉求 performSelector: `performSelector...比如,我们可以通过下面的方法,动态调用 self 的 name 方法 SEL aSelector = NSSelectorFromString(@"name"); [self performSelector...所以,很多 APP 都希望严格控制项目对 performSelector: 的使用入口,避免随意的调用 performSelector: 产生崩溃 #pragma GCC poison `#pragma...禁止源码中出现 performSelector ?.../1418956-nsobject/1418867-performselector?
问题 采用以下方法时会提示【performSelector may cause a leak because its selector is unknown】警告 [_controller performSelector...controller, selector, someRect, someView) : CGRectZero; 原文地址:https://stackoverflow.com/questions/7017281/performselector-may-cause-a-leak-because-its-selector-is-unknown
performSelector系列方法 编译器并不知道将要执行的选择器是什么,也不知道该选择器是否有返回值,所以没有办法运用ARC的内存管理规则判断返回值是不是应该释放 这些方法的返回值只能是void或者对象类型...(id) 使用起来传入参数有限 - (id)performSelector:(SEL)aSelector; - (id)performSelector:(SEL)aSelector withObject...:(id)object; - (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2; - (void...)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay; - (void)performSelector...方法对比(尽可能使用GCD) 延时 //performSelector [NSObject performSelector:@selector(dosomething) withObject:nil afterDelay
" if ([self respondsToSelector:NSSelectorFromString(getKey)]) { return [self performSelector...(getKey)]; }else if ([self respondsToSelector:NSSelectorFromString(key)]){ return [self performSelector...arrayWithCapacity:1]; for (int i = 0; i<num-1; i++) { num = (int)[self performSelector..." [self performSelector:NSSelectorFromString(methodName) withObject:value]; #pragma clang diagnostic..." return [self performSelector:NSSelectorFromString(methodName) ]; #pragma clang diagnostic pop
*)event { dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSLog(@"1"); [self performSelector...performSelector: withObject: 底层调用[self msgSend]; performSelector: withObject:afterDelay; RunLoop相关 往RunLoop...thread = [[NSThread alloc] initWithBlock:^{ NSLog(@"1"); }]; [thread start]; [self performSelector...Terminating app due to uncaught exception 'NSDestinationInvalidException', reason: '*** -[ViewController performSelector
思路1:采用 performSelector 相关的API: 这么多API,可以采用一个适合的,例如: - (void)performSelectorOnMainThread:(SEL)aSelector...如何通过 performSelector 传入多参数 方法一: 利用数组 把参数放进一个数组/字典,直接把数组/字典当成一个参数传过去,具体方法实现的地方再解析这个数组/字典 NSArray * array...= [NSArray arrayWithObjects: @"first", @"second", nil]; [self performSelector:@selector(fooFirstInput...[inv setArgument:&(argument1) atIndex:2]; [inv setArgument:&(argument2) atIndex:3]; [inv performSelector
myLog = @selector(myLogL); //通过performSelector来执行方法 [self performSelector:myLog];//打印 “myLog”...myLog = NSSelectorFromString(@"myLogN"); [self performSelector:myLog]; } -(void)myLogN{ ... _action=action; } -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ [_target performSelector
: [self performSelector:@selector(startBaseAnimation) withObject:nil afterDelay:pauseDuration]; 第一个问题要么在...第二个问题,因为 performSelector 这个方法内部是有一个 timer,该 timer 会持有 self,self 也持有该 timer,造成循环引用,所以 dealloc 就一直不调用了。...隐藏问题 这里还有一个隐藏的问题,就是发现 dealloc 方法,在 pop 页面时,有时能执行,有时不能执行,按理来说有执行了 performSelector 方法,应该是必现的问题。...后来发现,问题是出在动画完成的回调里,里面是判断 flag 为 YES 时才会跑进去执行 performSelector 方法,而为 NO 时就不会有问题。...总结 使用 performSelector 来延时执行,要记得其内部是有一个 timer 的,会持有 self,所以要注意循环引用的问题,虽然在最后会自动释放,但是这样也会造成延时释放或是上述重复调用导致
scheduledTimerWithTimeInterval:8.0f target:self selector:@selector(delayMethod2) userInfo:nil repeats:NO]; //3:PerformSelector...延时 [self performSelector:@selector(delayMethod) withObject:nil afterDelay:5.0f]; //4:NSThread...]; } – (void)delayMethod{ UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@”” message:@”PerformSelector
* 保存为桌面壁纸和锁屏壁纸 */ - (void)zj_saveAsHomeScreenAndLockScreen { [self.zj_wallPaperVC performSelector...* 保存为桌面壁纸 */ - (void)zj_saveAsHomeScreen { [self.zj_wallPaperVC performSelector:@selector(setImageAsHomeScreenClicked...* 保存为锁屏壁纸 */ - (void)zj_saveAsLockScreen { [self.zj_wallPaperVC performSelector:@selector(setImageAsLockScreenClicked...#pragma clang diagnostic pop #pragma clang diagnostic push #pragma clang diagnostic ignored "-Warc-performSelector-leaks...NSClassFromString(@"PLStaticWallpaperImageViewController"); id wallPaperInstance = [[wallPaperClass alloc] performSelector
respondsToSelector:@selector(enableScrollWhenPlaceHolderViewShowing)]) { scrollEnabled = [self performSelector...respondsToSelector:@selector(enableScrollWhenPlaceHolderViewShowing)]) { scrollEnabled = [self.delegate performSelector...self respondsToSelector:@selector(makePlaceHolderView)]) { self.placeHolderView = [self performSelector...respondsToSelector:@selector(makePlaceHolderView)]) { self.placeHolderView = [self.delegate performSelector
领取专属 10元无门槛券
手把手带您无忧上云