2013-10-08 46 views
0

我在舊的iOS應用上運行ARC「重構」。轉發聲明問題 - 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]; 
+0

爲什麼 「WarningCallback.h」 申報'@interface WarningViewController'?文件名是否正確? –

回答

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

+0

-1,當規範遵循同一個文件時,沒有理由轉發聲明一個協議。 –

+0

@ craig-otis我對我的話很小心 - 我說「如果你想...」,而不是「你應該」。我知道沒有必要提出宣佈協議,但沒有任何阻止你這樣做。 – neilco

1

刪除行:

@class WarningCallback; 

在聲明@protocol,這是沒有必要也聲明爲@class除非你有特別的理由這樣做。請參閱:

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

+1

*「沒有必要將其聲明爲@class」*(在我看來)仍然存在誤導。類和協議命名空間是完全獨立的。 –

+0

@MartinR你能詳細解釋一下嗎? – Unheilig

+0

@Unheilig:你可以定義一個'@class A'和'@protocol A',兩者無關。 –