前向声明问题 - ARC重构

时间:2013-10-08 16:37:45

标签: ios objective-c

我在旧的iOS应用程序上运行ARC'重构'。

但是,我收到以下错误

Receiver type 'WarningCallback' for instance message is a forward declaration

WarningCallback.h

@class WarningCallback; 

#import <UIKit/UIKit.h>
#import "WebViewController.h"
#import "Constants.h"

@protocol WarningCallback
-(void) warningDismissedAndNavigateToCall:(BOOL) navigateToCall; 
@end

@interface WarningViewController : WebViewController {
}
@property (nonatomic,retain) WarningCallback* parentVC;

@end

WarningCallback.m

#import "WarningViewController.h"


@implementation WarningViewController

@synthesize parentVC;

...

-(IBAction) done:(id) sender {

[[self parentVC] warningDismissedAndNavigateToCall:NO];

}




@end

错误发生在 WarningCallback.m

的以下行
   [[self parentVC] warningDismissedAndNavigateToCall:NO];

2 个答案:

答案 0 :(得分:1)

错误是因为行@class WarningCallback;。错误消息表示编译器找到了WarningCallback的前向声明,但无法找到相应的实现。那是因为WarningCallback不是一个类,而是一个协议。

如果要转发声明协议,可按以下步骤进行:

@protocol WarningCallback;

@interface WarningViewController : WebViewController

@property (nonatomic, weak) id<WarningCallback> parentVC;

@end

@protocol WarningCallback

- (void)warningDismissedAndNavigateToCall:(BOOL) navigateToCall;

@end

请注意我是如何声明parentVC的。

答案 1 :(得分:1)

删除该行:

@class WarningCallback;

声明@protocol时,除非您有特定原因,否则无需将其声明为@class。参见:

What's with the declare a class and declare a protocol with the same name?