Я пытаюсь изменить, какой метод вызывается для объекта ради обучения.
Вот мой код.
#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.
Результатом является Segfault.
Кажется, объект вызова, отправленный forwardInvocation, все еще имеет @selector (tryToSay :) в качестве селектора. Разве не предполагается получить тот же селектор, который был установлен в methodSignatureForSelector?