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"

編集:おっと、プロトコル参照を逃しました...ダンFの答えは正しいです

于 2012-07-10T18:47:26.523 に答える