Переадресация сообщений не работает (Objective-C) - PullRequest
0 голосов
/ 31 января 2019

Я пишу пример кода, чтобы понять пересылку сообщений в Objective C (iOS).

У меня есть два класса (класс A и класс B).Я хочу создать экземпляр класса B и установить для него переменную экземпляра класса A.Я вызываю метод Forward Invocation (пересылка сообщений) в следующем коде.

//  ViewController.h
//  TestInvocation
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@end

//  ViewController.m
//  TestInvocation
#import "ViewController.h"
#import "TestInvocation.h"
@interface ViewController ()
@end

@implementation ViewController
- (void)viewDidLoad {
    [TestInvocation testRun];
    [super viewDidLoad];
}
@end

//  TestInvocation.h
//  TestInvocation
#import <Foundation/Foundation.h>
@interface TestInvocation : NSObject
{}
+(void)testRun;
@end

//  TestInvocation.m
//  TestInvocation
#import "TestInvocation.h"
#import "ClassB.h"
#import "ClassA.h"
@implementation TestInvocation
+(void)testRun
{
    ClassB* diplomat = [[ClassB alloc] init];
    NSLog(@"value = %d",[diplomat value]);// Error shows up here on running: 
//No visible @interface for 'ClassB' declares the selector 'value'
}
   @end

//  ClassA.h
//  TestInvocation
#import <Foundation/Foundation.h>
@interface ClassA : NSObject
{
    int  value;
}
@property(readwrite,assign) int  value;
@end

//  ClassA.m
//  TestInvocation
#import "ClassA.h"
@implementation ClassA
@synthesize value;
@end

//  ClassB.h
//  TestInvocation
#import <Foundation/Foundation.h>
@interface ClassB : NSObject
{}
@end

//  ClassB.m
//  TestInvocation
#import "ClassB.h"
#import "ClassA.h"
@implementation ClassB
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
    return [ClassA instanceMethodSignatureForSelector:aSelector];
}
-(void)forwardInvocation:(NSInvocation *)anInvocation
{
    ClassA* negotiate = [[ClassA alloc] init];
negotiate.value = 15;
    [anInvocation invokeWithTarget:negotiate];
}
@end

Я ожидаю, что приведенный выше код будет работать.Но вместо этого я получаю следующую ошибку времени сборки:

Семантическая проблема ARC TestInvocation.m: 19: 35: Нет видимого @interface для 'ClassB', объявляет селектор 'value'

1 Ответ

0 голосов
/ 31 января 2019

Класс B должен иметь как минимум свойство интерфейса.Но вы можете сделать это @dynamic в реализации, если хотите вызвать forwardInvocation.

@interface ClassB : NSObject
@property (readwrite, assign) int value;
@end

@implementation ClassB
@dynamic value;
...
@end

Я думаю, что это должно сработать для вас.

...