1

Я попытался реализовать пересылку сообщений. 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 с пересылкой сообщений?

+0

Может быть ... но нет ответа там, я думаю. –

+0

Так что я не могу использовать отправку сообщений типа '[me spin];' больше? –

+1

Да, вот что я пытался объяснить в своем ответе на этот вопрос. –

ответ

0

Try объявляя меня ID:

id me = [[Hello alloc] init]; 
[me say]; 
[me spin]; 
+0

Это будет работать, если вы включите «World.h» в этот исходный файл, чтобы компилятор * знал *, что существует метод 'spin'. –

+0

Не работает 'AppDelegate.m: 23: 5: Множество методов с именем« spin »найдено с несоответствующим результатом, типом параметра или атрибутами –

+0

Да, это может работать только в том случае, если существует только один метод с именем' spin' (или, возможно, больше, но с той же подписью). – vkurchatkin

Смежные вопросы