一、performselector的含义
performselector是Objective-C中一种常用的方法调用方式。它允许我们在运行时动态调用一个方法,常常用于在主线程执行一些UI操作等。
二、performselector的语法格式
- (nullable id)performSelector:(SEL)aSelector;
- (nullable id)performSelector:(SEL)aSelector withObject:(nullable id)anObject;
- (void)performSelector:(SEL)aSelector withObject:(nullable id)anObject afterDelay:(NSTimeInterval)delay;
+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget;
performselector方法有三个主要参数:方法名,调用该方法的对象,以及传递给该方法的参数。performselector调用的方法必须为public或protected。如果方法为private,则必须在调用之前使用performselector:withobject:方法注册为可调用的方法。
三、performselector的使用场景及注意事项
1. 在主线程执行UI操作
在iOS开发中,所有的UI相关操作都必须在主线程中进行。如果在子线程中执行UI操作,程序就会抛出Exception异常。在performselector中,我们可以使用afterDelay参数指定执行时间。例如:
[self performSelector:@selector(updateUI:) withObject:data afterDelay:0.1];
这个例子中,我们将updateUI方法和data参数传递给了performselector方法,使用0.1秒的延迟时间在主线程中执行了该方法。
2. 多个线程之间通信
通过performselector,在多个线程之间进行通信也变得相当简单。可以使用以下方法在不同的线程之间传递消息:
[self performSelectorOnMainThread:@selector(updateUI:) withObject:data waitUntilDone:YES];
这个例子中,我们将updateUI方法和data参数传递给了performSelectorOnMainThread方法,在主线程上执行该方法。
3. performselector引起的内存泄漏问题
使用performselector时需要注意内存泄漏问题。如果调用对象dealloc时延迟方法还没有执行,那么程序就会崩溃。我们可以通过cancelPreviousPerformRequestsWithTarget方法取消定时器。
[NSObject cancelPreviousPerformRequestsWithTarget:self];
这个例子中,我们使用cancelPreviousPerformRequestsWithTarget方法取消了与self相关的所有延迟方法。
4. performselector的其他用途
performselector的用途并不仅限于上面提到的场景。除了这些场景,我们还可以使用该方法执行一些其他操作,例如动态调用方法,实现插件机制,并且performselector也可以通过NSInvocation封装,进行更加灵活的使用。
四、代码示例
1. 在主线程执行UI操作
- (void)updateUI:(NSData *)data {
// 执行UI操作
}
- (void)someMethod {
[self performSelector:@selector(updateUI:) withObject:data afterDelay:0.1];
}
2. 多个线程之间通信
- (void)updateUI:(NSData *)data {
// 执行UI操作
}
- (void)someMethod {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 执行一些操作
[self performSelectorOnMainThread:@selector(updateUI:) withObject:data waitUntilDone:YES];
});
}
3. performselector引起的内存泄漏问题
- (void)someMethod {
[self performSelector:@selector(updateUI:) withObject:data afterDelay:0.1];
// 准备释放对象
[self release];
}
- (void)dealloc {
// 取消之前的所有延迟方法
[NSObject cancelPreviousPerformRequestsWithTarget:self];
[super dealloc];
}
原创文章,作者:EFCVZ,如若转载,请注明出处:https://www.506064.com/n/334191.html