未调用forwardInvocation?
我在使forwardIncallation 正常工作时遇到问题。由于某种原因,Objective-C 运行时完全忽略我的forwardInitation: 方法并抛出无法识别的选择器异常。
我的测试代码如下:
@interface InvocationTest : NSObject
{
}
+ (void) runTest;
@end
@interface FullClass: NSObject
{
int value;
}
@property(readwrite,assign) int value;
@end
@implementation FullClass
@synthesize value;
@end
@interface SparseClass: NSObject
{
}
@end
@implementation SparseClass
- (void)forwardInvocation:(NSInvocation *)forwardedInvocation
{
NSLog(@"ForawrdInvocation called");
FullClass* proxy = [[[FullClass alloc] init] autorelease];
proxy.value = 42;
[forwardedInvocation invokeWithTarget:proxy];
}
@end
@implementation InvocationTest
+ (void) runTest
{
SparseClass* sparse = [[[SparseClass alloc] init] autorelease];
NSLog(@"Value = %d", [sparse value]);
}
@end
我正在处理以下资源中的信息:
http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtForwarding.html#/ /apple_ref/doc/uid/TP40008048-CH105 http://cocoawithlove.com/2008/03/construct-nsinvocau -for-any-message.html
据我所知,当我调用 [sparse value] 时,运行时应该在 SparseClass 的实例上调用forwardInvocation:,但它被完全忽略:
-[SparseClass value]:无法识别的选择器发送到实例 0x4b1c4a0 *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[SparseClass value]:无法识别的选择器发送到实例 0x4b1c4a0”
I'm having trouble getting forwardInvocation to work. For some reason, the Objective-C runtime completely ignores my forwardInvocation: method and throws an unrecognized selector exception.
My test code is as follows:
@interface InvocationTest : NSObject
{
}
+ (void) runTest;
@end
@interface FullClass: NSObject
{
int value;
}
@property(readwrite,assign) int value;
@end
@implementation FullClass
@synthesize value;
@end
@interface SparseClass: NSObject
{
}
@end
@implementation SparseClass
- (void)forwardInvocation:(NSInvocation *)forwardedInvocation
{
NSLog(@"ForawrdInvocation called");
FullClass* proxy = [[[FullClass alloc] init] autorelease];
proxy.value = 42;
[forwardedInvocation invokeWithTarget:proxy];
}
@end
@implementation InvocationTest
+ (void) runTest
{
SparseClass* sparse = [[[SparseClass alloc] init] autorelease];
NSLog(@"Value = %d", [sparse value]);
}
@end
I'm working off information from the following resources:
http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtForwarding.html#//apple_ref/doc/uid/TP40008048-CH105
http://cocoawithlove.com/2008/03/construct-nsinvocation-for-any-message.html
As far as I can tell, the runtime should be calling forwardInvocation: on the instance of SparseClass when I invoke [sparse value], but it gets completely ignored:
-[SparseClass value]: unrecognized selector sent to instance 0x4b1c4a0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[SparseClass value]: unrecognized selector sent to instance 0x4b1c4a0'
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您还必须重写
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
才能使其正常工作。我想
应该没问题。
You also have to override
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
to get it working.I guess
should be ok.
来自 NSObject 文档:
并且,来自 运行时文档:
注意: 请参阅 Jilouc 的 回答,以正确实现
methodSignatureForSelector:
。From the NSObject documentation:
And, from the runtime documentation:
Note: See Jilouc's answer for the proper implementation of
methodSignatureForSelector:
.