2011-10-29 3 views
27

한 메서드를 다른 메서드에 매개 변수로 전달하는 방법은 무엇입니까? 나는이 수업을 통해 이러고있다.매개 변수로 Objective-C 전달 메서드

클래스 A :

+ (void)theBigFunction:(?)func{ 
    // run the func here 
} 

는 클래스 B :

- (void)littleBFunction { 
    NSLog(@"classB little function"); 
} 

// somewhere else in the class 
[ClassA theBigFunction:littleBFunction] 

는 클래스 C :

- (void)littleCFunction { 
    NSLog(@"classC little function"); 
} 

// somewhere else in the class 
[ClassA theBigFunction:littleCFunction] 
+1

당신은 셀렉터 님, 비슷한 질문이 있습니다. http://stackoverflow.com/questions/519600/is-it-possible-to-pass-a-method-as-an-argument-in-objective-c – utahwithak

답변

43

당신이 찾고있는 유형은 선택 (SEL)이고, 당신이 얻을하는 방법의 다음과 같은 선택자 :

이 방법은 매개 변수를 사용하는 경우가 이런 식으로,가는 곳
SEL littleSelector = @selector(littleMethod); 

, 당신은 단지 :을 넣어 :

또한
SEL littleSelector = @selector(littleMethodWithSomething:andSomethingElse:); 

, 방법이 정말없는 기능을, 그들은 함께 시작할 때 특정 클래스 (메시지를 보내는 데 사용된다 +) 또는 특정 인스턴스 (-로 시작하는 경우). 함수는 메소드처럼 실제로 "목표"가없는 C 유형입니다.

[target performSelector:someSelector]; 

이것의 좋은 예 만들 때 일반적으로 사용 addTarget:action:forControlEvents: 방법은 UIControl의이다 :

당신이 선택을 일단 당신이 당신의 목표에 그 메소드를 호출 같은 (이 클래스 또는 인스턴스를 수) UIButton 또는 일부 다른 컨트롤 개체를 프로그래밍 방식으로.

+0

아시다시피 함수가 전달되면 어떻게 호출할까요? I * doubt * [self func]가 작동합니다. – Jacksonkr

+3

[대상 performSelector : someSelector]; –

7

목적 C는이 작업이 상대적으로 쉽습니다. Apple은 this documentation을 제공합니다.

질문에 직접 답하기 위해 함수를 호출하지 않고 선택기를 호출합니다.여기에 몇 가지 예제 코드는 다음과 같습니다

큰 기능 :

클래스 B에 대한 다음
+ (void)theBigFunction:(SEL)func fromObject:(id) object{ 
    [object preformSelector:func] 
} 

:

- (void)littleBFunction { 
    NSLog(@"classB little function"); 
} 

// somewhere else in the class 
[ClassA theBigFunction:@selector(littleBFunction) fromObject:self] 

그리고 클래스 C에 대한 :

- (void)littleCFunction { 
    NSLog(@"classC little function"); 
} 

// somewhere else in the class 
[ClassA theBigFunction:@selector(littleCFunction) fromObject:self] 

편집 : (전송 선택기를 수정 세미콜론을 제거하십시오)

+0

선택자가 메소드 설명과 일치하지 않으므로 끝에 ':'이 없어야합니다. –

+0

죄송합니다. 나는 객관적인 C 코더가 아니며 (필자 만이 그것을 다뤘다.) 나는 애플의 사례를 너무 가깝게 따라 갔다. – MJD