是否可以取消多个对象的执行选择器



我有几个类可以调用 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];
    }];
}

希望这有帮助。

最新更新