2012-06-05 3 views
3

performSelector : afterDelay를 호출 할 수있는 몇 가지 클래스가 있습니다.여러 객체에서 PerformSelector를 취소 할 수 있습니까?

경우에 따라 일부 및 전부를 취소하고 싶습니다.

그러나 모든 cancelPerformSelector 형식 메서드는 대상을 가지므로 한 번에 모든 것을 취소 할 수있는 방법이 없을 것입니다 (다른 대상이 있으므로).

nil을 대상으로 지정하지 않으면 모든 것이 취소됩니까?

또는 목표는 당신이보기 컨트롤러는 다음과 같은 선언이 같은 가정

[NSObject cancelPreviousPerformRequestsWithTarget:[NSRunLoop mainRunLoop]] 
+0

취소 할 수있는 모든 대상의 배열을 유지 한 다음 요청을 취소하기 위해 모든 대상을 반복해야합니다. – Joe

+0

위의 코드가 작동하지 않는 이유는 무엇입니까? 이론 상으로는 틀림 없어? – Gruntcakes

+0

'nil' 또는'nil'을 넘는 곳에서는 어디에도 보이지 않습니다. (https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsobject_Class/Reference/Reference.html) NSRunLoop은 모든 이전 요청을 취소 할 것이므로 이론적으로 작동 할 것이라고 믿을만한 이유가 없습니다. – Joe

답변

1

로 [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]; 
    }]; 
} 

희망이 있습니다.

+0

+1 감사합니다. 자세한 설명을 위해. API가 의도하지 않은 작업을하도록 강요해서는 안됩니다. 그리고 종종 이것은 객체를 추적하고 객체를 반복함으로써 극복됩니다. 반복을 피하기 위해 사람들이 기꺼이하는 일이 놀랍습니다. – Joe

관련 문제