2012-06-28 3 views

답변

4

objective-c 메시징에서 숨겨진 매개 변수를 사용하여 선택기의 이름과 대상을 가져 오는 방법이 있습니다.

objc_msgSend이 메소드를 구현하는 방법을 발견, 프로 시저를 호출하고 그것에게 메시지의 모든 인수를 전달 그것을 : Apple's documentation에서.

id target = getTheReceiver(); 
    SEL method = getTheMethod(); 

여전히 충분하지 않으면 : 그래서 방법에 다음과 같은 얻을 수

수신이 방법

위한 선택 객체 : 그것은 또한 절차 두 숨겨진 인수를 전달 필요에 따라 다음을 수행 할 수 있습니다.

  1. Helper이라는 클래스를 만듭니다.
  2. 형식으로, 당신이 메소드를 호출 곳에서 클래스에 대한 참조를 추가 : id <HelperDelegate> myClassReference;
  3. 을 당신이 대신 [self method]을이 Helper 클래스의 인스턴스를 생성하고 [helper method];처럼의 메서드를 호출하고 추가해야하는 경우 이 [helper setMyClassReference:self];.
  4. 앱이 충돌하지만 Helper 클래스에 forwardInvocation:을 추가하기 만하면됩니다. 거기에서 NSInvocation 개체를 얻을 수 있습니다. 필요한 작업을 수행 한 다음 [anInvocation invokeWithTarget:myClassReference];을 입력하면 원래 발신자에게 메시지를 전달할 수 있습니다.

P.S :이 ... 질문, 질문에 한 대답하지 않는 정말로 내가 이것에 대해 생각하고있어 경우에도 마찬가지입니다.

+0

안녕하세요, "중간"개체로 해결 방법을 좋아합니다! – Geri

+0

정말 좋습니다! – Geri

+0

지금 당장 들어가겠습니다. – Geri

1

그래서이 수업을 만들었지 만 매력처럼 작동합니다.

.H

@protocol PGMessageObserverDelegate 
-(void)observedInvocation:(NSInvocation*) invocation willSendToObject:(id) object; 
-(void)observedInvocation:(NSInvocation*) invocation didSendToObject:(id) object; 
@end 


@interface PGMessageObserver : NSObject 

@property (nonatomic, readonly) id observable; 
@property (nonatomic, readonly) id <PGMessageObserverDelegate> delegate; 

+(id)messageObserverObserving:(id) observable delegate:(id) delegate; 

@end 

하는 .m

#import "PGMessageObserver.h" 


@interface PGMessageObserver() 
-(id)initWithObservable:(id) observable delegate:(id) delegate; 
@end 


@implementation PGMessageObserver 
@synthesize observable = _observable; 
@synthesize delegate = _delegate; 



#pragma mark - Creation 

+(id)messageObserverObserving:(id) observable delegate:(id) delegate 
{ 
    return [[[PGMessageObserver alloc] initWithObservable:observable delegate:delegate] autorelease]; 
} 

-(id)initWithObservable:(id) observable delegate:(id) delegate 
{ 
    if (self = [super init]) 
    { 
     _observable = observable; 
     _delegate = delegate; 
    } 
    return self; 
} 


#pragma mark - Message forwarding 

-(void)forwardInvocation:(NSInvocation*) invocation 
{ 
    //Notify. 
    [_delegate observedInvocation:invocation willSendToObject:_observable]; 

     //Forward. 
     if (_observable != nil) 
     { 
      [invocation invokeWithTarget:_observable]; 

      //Notify. 
      [_delegate observedInvocation:invocation didSendToObject:_observable]; 
     } 
} 

-(NSMethodSignature*)methodSignatureForSelector:(SEL) selector 
{ 
    return [_observable methodSignatureForSelector:selector]; 
} 

@end 

모든 경우에 적용 할 수있는 엄격한 아니라, 그것이 나에 대한 모든 행동이 관찰자에게 보낼 통지하고, 메시지가 착신 전환됩니다 원래의 대상으로 (관찰 가능).

클라이언트 코드는 ... 어딘가에

@property (nonatomic, retain) PGMessageObserver *messageObserver; 
#define self_OBSERVED _messageObserver 

... 및 설치 단지 유지 속성입니다.

self.messageObserver = [PGMessageObserver messageObserverObserving:self delegate:self]; 

관찰 가능한 메시지는 SELF_OBSERVED insted of self로 보내야합니다.

+0

Geri, 당신은 그것의 실제적인 목적을 말할 수 있습니까? :) – Peres

+0

주어진 앱의 원격 연결된 미러 앱을 만듭니다. 많은 메소드가 피어 장치에서 호출되어야합니다 (실제 메시지/작업을 알지 못함). – Geri