我正在编写示例代码以了解 Objective C (iOS) 中的消息转发。
我有两个班(A班和B班)。我想创建一个 B 类的实例并为其设置一个 A 类实例变量。我在下面的代码中调用了转发调用方法(消息转发)。
// 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:“ClassB”没有可见的@interface 声明选择器“值”