개체에 메시지를 보낼 때마다 선택기 이름, 인수, 보낸 사람 또는 NSInvocation 인스턴스를 가져 오려고합니다. 가능한? forwardInvocation :하지만 evey 경우 (모든 메소드 호출)와 같은 것.개체 (iOS)에서 호출 된 모든 메시지 호출을 관찰 할 수있는 방법이 있습니까?
3
A
답변
4
objective-c 메시징에서 숨겨진 매개 변수를 사용하여 선택기의 이름과 대상을 가져 오는 방법이 있습니다.
objc_msgSend이 메소드를 구현하는 방법을 발견, 프로 시저를 호출하고 그것에게 메시지의 모든 인수를 전달 그것을 : Apple's documentation에서.
id target = getTheReceiver(); SEL method = getTheMethod();
여전히 충분하지 않으면 : 그래서 방법에 다음과 같은 얻을 수
수신이 방법
위한 선택 객체 : 그것은 또한 절차 두 숨겨진 인수를 전달 필요에 따라 다음을 수행 할 수 있습니다.
Helper
이라는 클래스를 만듭니다.- 형식으로, 당신이 메소드를 호출 곳에서 클래스에 대한 참조를 추가 :
id <HelperDelegate> myClassReference;
- 을 당신이 대신
[self method]
을이Helper
클래스의 인스턴스를 생성하고[helper method];
처럼의 메서드를 호출하고 추가해야하는 경우 이[helper setMyClassReference:self];
. - 앱이 충돌하지만
Helper
클래스에forwardInvocation:
을 추가하기 만하면됩니다. 거기에서NSInvocation
개체를 얻을 수 있습니다. 필요한 작업을 수행 한 다음[anInvocation invokeWithTarget:myClassReference];
을 입력하면 원래 발신자에게 메시지를 전달할 수 있습니다.
P.S :이 ... 질문, 질문에 한 대답하지 않는 정말로 내가 이것에 대해 생각하고있어 경우에도 마찬가지입니다.
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로 보내야합니다.
안녕하세요, "중간"개체로 해결 방법을 좋아합니다! – Geri
정말 좋습니다! – Geri
지금 당장 들어가겠습니다. – Geri