gpt4 book ai didi

objective-c - 是否可以取消多个对象上的 PerformSelector?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:25:19 27 4
gpt4 key购买 nike

我有几个类可以调用 performSelector:afterDelay。

在某些情况下,我想取消所有这些。

但是所有的 cancelPerformSelector 类型方法都采用一个目标,因此似乎没有办法一次性取消所有内容(因为有不同的目标)?

除非指定 nil 作为目标会取消一切?

或者可以将目标指定为 [NSRunLoop mainRunLoop] 以取消一切,例如

[NSObject cancelPreviousPerformRequestsWithTarget:[NSRunLoop mainRunLoop]]

最佳答案

假设您有一个声明为类似于以下内容的 View Controller :

@interface CarViewController : UIViewController

@property (strong) id myObject;

@end

还假设您已经在实现中的某个地方使用 myObject 实例注册了执行选择器的请求,如下面的代码:

[self.myObject performSelector:@selector(someSelector) withObject:nil afterDelay:0.0];

为了论证,您希望 View Controller 在从内存中卸载之前取消所有先前的执行请求,您的 -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];
}];
}

希望这对您有所帮助。

关于objective-c - 是否可以取消多个对象上的 PerformSelector?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10902713/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com