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;
더 복잡한 메소드의 경우'objc_msgSend (myFoo, selector, args)'를 사용하십시오. 인자의 타입과 메소드의 리턴 타입에 따라 호출하기 전에'& objc_msgSend'를 적절한 함수 포인터 타입으로 캐스트해야합니다. –
@Jonathan 덧글 주셔서 감사합니다, 그것은 더 복잡한 메서드뿐만 아니라 간단한 ons (@typeoneerror의 답변을 잘 작동) 호출해야 할 일이 일어난다. 'objc_msgSend'가 이미 메시지를 보낼 때 id를 반환하는 이유는 무엇입니까? – Ali
'objc_msgSend'는 실제로 selector에 의해 명명 된 메소드의 반환 값을 반환합니다. 기본적으로 Objective-C 메소드는'id'를 리턴하므로'objc_msgSend'의 리턴 타입이 일치합니다. 그러나 다른 반환 유형의 경우 반드시'objc_msgSend()'를 캐스트해야하며 그렇지 않으면 정의되지 않은 동작 영역에 들어갑니다. (전문가는 진술과 관련된 흔들 거리는 방을 알고 있지만 언어 전문가가되기 전에는 엄격하게 코드를 작성하는 것이 좋습니다.) –