0

DataManagerというシングルトンクラスがあります。このクラスは、plistファイルのロードと保存を処理するために他のいくつかのクラスによって使用されます。

DataManagerがスクリーンショットとplistファイルを保存する機能を追加しています。これには、スクリーンショットを撮りたいビューをロードする必要があります。ロードしているビューは、DataManagerをインポートするコントローラーからのものです。

明らかにこれは循環依存であるため、私は以下を使用しました。

@class GardenView;

ただし、これにより次のエラーが発生しました。

  • クラスメッセージのレシーバー「GardenView」は前方宣言です
  • インスタンスメッセージの受信者タイプ「GardenView」は転送です
  • 宣言プロパティ'bounds'がフォワードクラスで見つかりません
  • オブジェクト'GardenView'プロパティ'layer'がフォワードクラスオブジェクト'GardenView'に見つかりません

これは、UIViewスーパークラスから継承されたプロパティを見つけることができないようです。これはフォワードクラス宣言にも当てはまりますか?

@classの代わりに標準の#importを使用すると、次のようになります。

  • 解析の問題:予想されるタイプ

Plantを参照するGardenViewのメソッド(私は問題なくインポートしています):

- (void) addPlantToView: (Plant*) plant;
- (void) addPlantToGarden: (Plant*) plant;
- (void) addPlantToViewAndGarden: (Plant*) plant;

PlantクラスはDataManagerをインポートしますが、@ classに変更すると、次のようになります。

  • セレクター'sharedDataManager'の既知のクラスメソッドがありません

この問題の解決策は何ですか?クラスメソッドはヘッダーファイル(+ sharedDataManager)にあります。私は完全に間違ったことをしていますか?

4

1 に答える 1

4

どこでインポートを行っているのか、どこで行っているのかを明確にしていません@class。そして、それが混乱を引き起こしていると思います。これがあなたがしたいことです:

  • GardenView.hで、@class Plant
  • Plant.hで、@class GardenView
  • GardenView.mで、#import "Plant.h"
  • Plant.mで、#import "GardenView.m"

これにより、ヘッダーの循環依存関係が解消されますが、実装は依存クラスの完全な情報を確認できます。

@classさて、単独では不十分な理由@class Fooは、クラスについて何も言わずに、コンパイラに「Fooという名前のクラスが存在する」と伝えるだけだからです。コンパイラはそのメソッドを知りません。それはそのスーパークラスを知りません。知っているのは、トークンを検出した場合Foo、それがクラスタイプを表すことだけです。これをヘッダーファイルで使用して、引数と戻り型でクラスを参照できるようにすることができますが、実際にその型の値で何かを行うには、完全なが必要です#import#importしかし、それを.mファイルに問題なく入れることができます。

#importヘッダーの代わりに必要なの@classは、問題のクラスから継承する場合のみです。前方宣言されたクラスから継承することはできないため、完全なが必要です#import。もちろん、#import同じヘッダーで定義されている他のタイプ(構造体、列挙型など)にアクセスする必要がある場合も必要になることがありますが、obj-cではあまり一般的ではありません。

于 2012-12-10T20:37:11.403 に答える