每次向对象发送消息时,我只想获取选择器名称以及参数、发送者或 NSInvocation 实例。可能的?像 forwardInvocation: 之类的东西,但在每种情况下(每个方法调用)。
问问题
1169 次
2 回答
4
有一种方法可以通过使用 Objective-C 消息传递中的隐藏参数来获取选择器的名称和目标。来自苹果的文档:
当 objc_msgSend 找到实现方法的过程时,它调用该过程并将消息中的所有参数传递给它。它还向过程传递了两个隐藏参数:
接收对象 方法的选择器
因此,在一种方法中,您可以获得以下内容:
id target = getTheReceiver();
SEL method = getTheMethod();
如果仍然无法满足您的需求,您可以执行以下操作:
- 创建一个名为
Helper
. - 添加对将调用方法的类的引用,格式如下:
id <HelperDelegate> myClassReference;
- 当您需要
[self method]
创建一个此类的实例Helper
并调用它的方法时,就像[helper method];
添加 this一样[helper setMyClassReference:self];
。 - 该应用程序应该崩溃,但是,只需
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 回答