ARC и пересылка сообщений

Я пытался реализовать пересылку сообщений. Xcode 5, ARC включен, новый проект iPhone по умолчанию. Я читаю документацию здесь

У меня есть два пользовательских класса в моем проекте: 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 с пересылкой сообщений?

1 ответ

Попробуйте объявить меня идентификатором:

 id me = [[Hello alloc] init];
 [me say];
 [me spin];
Другие вопросы по тегам