我有几个类可以调用 performSelector:afterDelay。
在某些情况下,我想取消任何和所有。
但是,所有 cancelPerformSelector 类型方法都采用一个目标,因此似乎没有办法一次性取消所有内容(因为有不同的目标)?
除非指定 nil 作为目标会取消一切?
或者是否可以将目标指定为 [NSRunLoop mainRunLoop] 以取消所有内容,例如
[NSObject cancelPreviousPerformRequestsWithTarget:[NSRunLoop mainRunLoop]]
假设您声明了一个类似于以下内容的视图控制器:
@interface CarViewController : UIViewController
@property (strong) id myObject;
@end
还假设您已在实现中的某个位置向myObject
实例注册了执行选择器的请求,如下面的代码所示:
[self.myObject performSelector:@selector(someSelector) withObject:nil afterDelay:0.0];
为了便于讨论,您希望视图控制器在从内存中卸载之前取消所有先前的执行请求,-viewWillUnload
消息如下所示:
- (void)viewWillUnload {
[NSObject cancelPreviousPerformRequestsWithTarget:self.myObject]
}
这将取消为该特定实例注册的所有执行请求。正如 Joe 指出的那样,如果你没有自己保留对对象的强引用,并且将这些对象存储在NSArray
中,你需要迭代该数组并为数组的每个元素调用+cancelPreviousPerformRequestsWithTarget:
,甚至NSArray
的-enumerateObjectsUsingBlock:
:
- (void)viewWillUnload {
[myArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[NSObject cancelPreviousPerformRequestsWithTarget:obj];
}];
}
希望这有帮助。