Я попытался реализовать пересылку сообщений. Xcode 5, ARC включен, новый проект iPhone по умолчанию. I read a documentation hereARC и пересылка сообщений
У меня есть два пользовательских класса в моем проекте: Hello
и World
.
#import <Foundation/Foundation.h>
@interface Hello : NSObject
- (void) say;
@end
#import "Hello.h"
#import "World.h"
@implementation Hello
- (void) say {
NSLog(@"hello!");
}
-(void)forwardInvocation:(NSInvocation *)invocation {
NSLog(@"forward invocation");
World *w = [[World alloc] init];
if ([w respondsToSelector:[invocation selector]]) {
[invocation invokeWithTarget:w];
} else {
[self doesNotRecognizeSelector: [invocation selector]];
}
}
-(NSMethodSignature*)methodSignatureForSelector:(SEL)selector {
NSLog(@"method signature");
NSMethodSignature *signature = [super methodSignatureForSelector:selector];
if (! signature) {
World *w = [[World alloc] init];
signature = [w methodSignatureForSelector:selector];
}
return signature;
}
@end
Мир прост:
#import <Foundation/Foundation.h>
@interface World : NSObject
- (void) spin;
@end
#import "World.h"
@implementation World
- (void) spin {
NSLog(@"spin around");
}
@end
В моей AppDelegate я написал три простые линии:
Hello *me = [[Hello alloc] init];
[me say];
[me spin];
И компилятор дать мне ошибку: AppDelegate.m:23:9: No visible @interface for 'Hello' declares the selector 'spin'
и не строит проект. Когда я перепечатаю его: [me performSelector:@selector(spin)];
- он отлично работает.
Код [me spin]
работает, когда ARC выключен (только компилятор генерирует предупреждение AppDelegate.m:23:9: 'Hello' may not respond to 'spin'
).
Мои вопросы: почему? и как я могу использовать ARC с пересылкой сообщений?
Может быть ... но нет ответа там, я думаю. –
Так что я не могу использовать отправку сообщений типа '[me spin];' больше? –
Да, вот что я пытался объяснить в своем ответе на этот вопрос. –