3

ビルド時間を短縮し、コードをできるだけ簡潔に保つために、ヘッダー ファイルで前方宣言を使用#importし、実装ファイルにステートメントを配置しています。これはこれまでのところうまく機能していますが、問題が発生しました。MyClass次のようなclass のオブジェクトを返すクラスがあるとしますWidget

@interface MyClass : NSObject
-(Widget*)widgetWithName:(NSString*)name;
@end

Widgetメソッドがあると仮定する-(void)arbitraryMethod;

ここで、 をインポートし、オブジェクトをMyClass.hインスタンス化し、 を実行し、返された にメッセージを送信しようとするクラスを実装しているとします。エラーが発生します。そのため、ヘッダー ファイルをインポートしてエラーを修正する必要があります。MyClasswidgetWithName:arbitraryMethodWidgetreceiver type "Widget" for instance message is a forward declarationWidget.h

もちろん、私がFoundationクラスを返すとき、これ#import <Foundation/Foundation.h>は決して問題ではありませんPrefix.pch.

ベストプラクティスは何ですか? 私の直感では、クラスを返す場合、またはそのクラスをパブリック メソッドの引数として使用する場合、ヘッダー ファイルをヘッダー ファイルに含める必要があります。そうしないと、公開メソッドで 10 個の異なる非基礎クラスを使用するクラスがあった場合、ユーザーはそのメソッドを使用するたびに、新しいヘッダー ファイルを探し出してプロジェクトにインポートする必要があります。

これは正しいですか、それとも使用するより良いパターンがありますか?

4

2 に答える 2

3

戻り値の型で使用しているクラスのヘッダーをインポートしていないところまで、ヘッダーのヘッダーのインポートをスキップすることはできません。@class Widget;この種の状況では、 inMyClassのヘッダーを使用すると想定しています。型が単独で前方宣言されているオブジェクトに対してメソッドを呼び出すことはできません。なぜなら、 bbum が言っ@classたことを覚えているように、コンパイラには必要なデータがないからです。基本的に、 を使用して「存在する」ことを除いて、クラスについて何も伝えていません。これは、通常、循環参照を壊す以上の目的では使用されません。実装で内部的に使用するクラスのヘッダーをインポートすることはできる限りきれいだと思いますが、あなたが言ったように、@class

于 2013-01-07T18:48:34.323 に答える
0

あなたはすべてを正しく行っています。

MyClass.hはい、 と の両方をWidget.h他のクラス実装ファイルにインポートする必要があります。実際には Widget クラスを使用しているWidget.hため、インポートする必要があります。タイプ のオブジェクト ポインタでメソッドを呼び出します。実装ファイルでは、実際に使用される各クラスのヘッダーをインポートする必要があります。どのヘッダーがインポートされるか、またはインポートされないかを気にする必要はありません (あなたが行っているように、インポートはできるだけ少なくする必要があります)。Widget *MyClass.h

于 2013-01-07T21:56:00.973 に答える