2012-07-10 48 views
0

当我遇到一些错误时,我正在构建一个应用程序。在做了一些研究之后,我发现原因是因为我正在处理2个文件,每个文件都是#import。我读到了解决这个问题的方法是使用前向声明,但我无法找到一个很好的例子来说明这是如何实现的。转发声明

这是我的。

RootViewController.h

#import <UIKit/UIKit.h> 
#import "FirstDetailViewController.h" 

@protocol SubstitutableDetailViewController 
- (void)showRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem; 
- (void)invalidateRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem; 
@end 


@interface RootViewController : UITableViewController <UISplitViewControllerDelegate, FirstDetailViewControllerDelegate>{ 

    UISplitViewController *splitViewController; 

    UIPopoverController *popoverController;  
    UIBarButtonItem *rootPopoverButtonItem; 

    NSMutableArray *logMessages; 
} 

@property (nonatomic, assign) IBOutlet UISplitViewController *splitViewController; 

@property (nonatomic, retain) UIPopoverController *popoverController; 
@property (nonatomic, retain) UIBarButtonItem *rootPopoverButtonItem; 

@end 

FirstViewDetailController.h

#import <UIKit/UIKit.h> 
#import "RootViewController.h 

//test2 
@protocol FirstDetailViewControllerDelegate <NSObject> 
- (void)addItemViewController:(FirstDetailViewController *)controller didFinishEnteringItem:(NSString *)item; 
@end 
//end test2 

@interface FirstDetailViewController : UIViewController <SubstitutableDetailViewController> { 

    //for the output 
    IBOutlet UITextView *outputView; 

    UIToolbar *navigationBar; 

} 

@property (nonatomic, retain) IBOutlet UIToolbar *navigationBar; 

//test 
@property(nonatomic, retain) NSString *message; 
//end test 

@property (nonatomic, retain) id <FirstDetailViewControllerDelegate> delegate; 

@end 

我知道,我需要更换#import@class,但我做了两次出现?另外,我已经在RootViewController.m文件中使用了#import "FirstDetailViewController.h",那么我还需要在那里切换它吗?

我有点困惑,所以任何帮助将不胜感激!

回答

1

前向声明是解决方案,如果它只是你需要的指针,但是你在每个类中实现另一个头的协议。

我的建议是在其他头文件中声明你的协议,例如MyProtocols.h,并将它包含在你的两个.h文件中而不是控制器的头文件中。

在一个侧面说明,具有雄厚的实力,或保留引用一个人的代表是不是真的标准的做法,因为这很容易引起保持周期从而导致泄漏的内存

+0

我在执行协议的原因是因为我想从一个类值传递给另一个。我在[THIS](http://stackoverflow.com/questions/5210535/passing-data-between-view-controllers)问题中的第一个答案,因为显然这是做到这一点的正确方法。 – BloonsTowerDefence 2012-07-10 18:58:15

+0

这就是一切都好,你只需要将协议声明移动到一个新的文件 – 2012-07-10 19:00:05

+0

好棒,感谢您的帮助 – BloonsTowerDefence 2012-07-10 19:18:33

1

更换

#import "FirstDetailViewController.h"

@class FirstDetailViewController;


更换

#import "RootViewController.h"

@class RootViewController;


在RootViewController.m

,请确保您有

#import "RootViewController.h" 

#import "FirstDetailViewController.h" 

在FirstDetailViewController.h

请确保您有

#import "FirstDetailViewController.h" 

#import "RootViewController.h" 

编辑:哎呀错过了协议引用...空间Dan F的答案是正确

+0

编译器需要了解每个类正在实现的协议,而不是每个类本身的存在 – 2012-07-10 18:59:44