gpt4 book ai didi

objective-c - 选择器未由 methodSignatureForSelector 发送到 forwardInvocation

转载 作者:行者123 更新时间:2023-12-04 06:36:57 27 4
gpt4 key购买 nike

为了学习,我正在尝试更改在对象上调用的方法。
这是我的代码。

#import <Foundation/Foundation.h>

@interface A : NSObject
-(void) say: (NSString*) s;
-(NSMethodSignature*) methodSignatureForSelector: (SEL) aSelector;
-(void) forwardInvocation: (NSInvocation*) invocation;
@end

@implementation A
-(void) say: (NSString*) s {
printf( "say \"%s\"", [s UTF8String] );
}
-(NSMethodSignature*) methodSignatureForSelector: (SEL) aSelector {
return [A instanceMethodSignatureForSelector: @selector(say:)];
}
-(void) forwardInvocation: (NSInvocation*) invocation {
// [invocation setSelector:@selector(say:)];
[invocation invokeWithTarget:self];
}
@end

int main(int args, char* argv[]){
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
A* myObject = [[[A alloc] init] autorelease];

[myObject tryToSay:@"Hello strange method!"];

[pool release];
return 0;
}

我想使用 -say: 无论尝试对 A 类的对象使用哪种方法。

结果是段错误。
发送到 forwardInvocation 的调用对象似乎仍然有 @selector(tryToSay:) 作为它的选择器。它不应该获得在 methodSignatureForSelector 中设置的相同选择器吗?

最佳答案

不,这不对。 NSMethodSignature不编码选择器。相反,它对方法的签名进行编码。这意味着诸如参数的类型和数量之类的事情。它也不会正常工作。如果有人试图调用像 -setInteger: 这样的方法它需要一个 NSUInteger,它将被传递给您的方法 -say:期待 NSString* .但它不会得到 NSString* ,它会得到一个 NSUInteger ,以及任何取消引用的尝试都会崩溃(除非它是 0)。

关于objective-c - 选择器未由 methodSignatureForSelector 发送到 forwardInvocation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4765782/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com