2011-09-12 3 views
3

런타임에 메시지를 작성하고 iOS의 objective-c 객체에 보낼 수 있습니까?
의 나는 내가런타임시 iOS의 Objective-c 객체에 동적 메시지 보내기

NSString * d = @"action1:"; 
[myFoo d]; 
d = @"action2:"; 
[myFoo d]; 

Foo 같은 것을 사용할 수 있도록하려면 Foo 클래스의 인스턴스가 있다고 가정 해 봅시다 두 개 이상의 인스턴트 방법이 있습니다 있습니다

-(void) action1:(id)sender; 
-(void) action2:(id)sender; 

답변

11
NSString *d = @"action1:"; 
SEL selector = NSSelectorFromString(d); 
if ([myFoo respondsToSelector:selector]) 
{ 
    [myFoo performSelector:selector withObject:someObject]; 
} 

NSObject에 다른 수의 다른 performSelector 방법. 매개 변수없이 지연 등을 사용하여 호출 할 수 있습니다.

+3

더 복잡한 메소드의 경우'objc_msgSend (myFoo, selector, args)'를 사용하십시오. 인자의 타입과 메소드의 리턴 타입에 따라 호출하기 전에'& objc_msgSend'를 적절한 함수 포인터 타입으로 캐스트해야합니다. –

+0

@Jonathan 덧글 주셔서 감사합니다, 그것은 더 복잡한 메서드뿐만 아니라 간단한 ons (@typeoneerror의 답변을 잘 작동) 호출해야 할 일이 일어난다. 'objc_msgSend'가 이미 메시지를 보낼 때 id를 반환하는 이유는 무엇입니까? – Ali

+1

'objc_msgSend'는 실제로 selector에 의해 명명 된 메소드의 반환 값을 반환합니다. 기본적으로 Objective-C 메소드는'id'를 리턴하므로'objc_msgSend'의 리턴 타입이 일치합니다. 그러나 다른 반환 유형의 경우 반드시'objc_msgSend()'를 캐스트해야하며 그렇지 않으면 정의되지 않은 동작 영역에 들어갑니다. (전문가는 진술과 관련된 흔들 거리는 방을 알고 있지만 언어 전문가가되기 전에는 엄격하게 코드를 작성하는 것이 좋습니다.) –