3

PerformSelector:afterDelayを呼び出すことができるクラスがいくつかあります。

状況によっては、それらのすべてをキャンセルしたい場合があります。

ただし、すべてのcancelPerformSelectorタイプのメソッドはターゲットを取得するため、(ターゲットが異なるため)一度にすべてをキャンセルする方法はないように思われますか?

ターゲットとしてnilを指定しない限り、すべてがキャンセルされますか?

または、ターゲットを[NSRunLoop mainRunLoop]として指定して、次のようなすべてをキャンセルすることもできます。

[NSObject cancelPreviousPerformRequestsWithTarget:[NSRunLoop mainRunLoop]]
4

1 に答える 1

1

次のように宣言されたViewControllerがあると仮定します。

@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];
    }];
}

お役に立てれば。

于 2012-06-06T10:29:47.180 に答える