3

每次向对象发送消息时,我只想获取选择器名称以及参数、发送者或 NSInvocation 实例。可能的?像 forwardInvocation: 之类的东西,但在每种情况下(每个方法调用)。

4

2 回答 2

4

有一种方法可以通过使用 Objective-C 消息传递中的隐藏参数来获取选择器的名称和目标。来自苹果的文档

当 objc_msgSend 找到实现方法的过程时,它调用该过程并将消息中的所有参数传递给它。它还向过程传递了两个隐藏参数:

接收对象 方法的选择器

因此,在一种方法中,您可以获得以下内容:

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

如果仍然无法满足您的需求,您可以执行以下操作:

  1. 创建一个名为Helper.
  2. 添加对将调用方法的类的引用,格式如下:id <HelperDelegate> myClassReference;
  3. 当您需要[self method]创建一个此类的实例Helper并调用它的方法时,就像[helper method];添加 this一样[helper setMyClassReference:self];
  4. 该应用程序应该崩溃,但是,只需forwardInvocation:Helper类上添加。从那里,您将能够获得该NSInvocation对象。做你需要做的事情,然后:[anInvocation invokeWithTarget:myClassReference];这样你就可以将消息传递给原始调用者。

PS:即使这不能回答你的问题,+1 的问题.. 真的让我思考这个问题。

于 2012-06-28T13:32:03.773 回答
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。

于 2012-06-28T14:26:09.880 回答