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,但我是否对这两种情况都这样做?另外,我已经#import "FirstDetailViewController.h"在 RootViewController.m 文件中,所以我也将其切换到那里吗?

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

4

2 回答 2

1

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

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

附带说明一下,对一个委托人进行强引用或保留引用并不是真正的标准做法,因为这很容易导致保留周期,从而导致内存泄漏

于 2012-07-10T18:45:03.840 回答
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的答案是正确的

于 2012-07-10T18:47:26.523 回答