1

サブクラス化されたオブジェクトであるタイプのプロパティを持つcalledのサブクラスがありUIViewControllerます。実装とインターフェースは次のようになります。FullScreenViewControllerImageScrollViewUIScrollView

FullScreenViewController.h

#import <UIKit/UIKit.h>

@class ImageScrollView;

@interface FullScreenViewController : UIViewController 
{
    ImageScrollView *_scrollView;

}

@property(nonatomic, retain) ImageScrollView *scrollView;

@end

FullScreenViewController.m

#import "FullScreenViewController.h"
#import "ImageScrollView.h"

@implementation FullScreenViewController

@synthesize scrollView = _scrollView;
...
@end

FullScreenViewController、私はサブクラスを作成し、プロパティから任意のプロパティにアクセスしようとすると、ImageScrollView「プロパティが見つかりません」というエラーメッセージが表示され続けます。サブクラスに追加ImageScrollView.hすると機能しますが、理解できません。すでに追加ImageScrollView.hしましたがFullScreenViewController、なぜ再度追加する必要があるのですか?

更新:フォワードクラス宣言を使用するのではなく、FullScreenViewController.hにImageScrollView.hを含めました。.hファイルを含めるのではなく、前方宣言を使用したことがある理由について少し混乱していますか?

4

3 に答える 3

3

追加する必要があるのは、FullScreenViewController.h ファイルに @class 宣言しかないためです。それはクラス ImageScrollView のオブジェクトへのポインターとして型 ImageScrollView* の変数を宣言するだけです。ImageScrollView のプロパティにはアクセスできません。ImageScrollView に固有のメソッドとプロパティにアクセスするには、ImageScrollView の @interface 宣言を含める必要があります。これは、ImageScrollView.h ファイルにあると想定しています。

于 2012-05-12T06:54:58.250 に答える
2

ヘッダーを考えると:

@interface FullScreenViewController : UIViewController 
{
    ImageScrollView *_scrollView;

}

@property(nonatomic, retain) ImageScrollView *scrollView;

@end

必要なのは前方宣言@class ImageScrollViewだけです。これは、 という名前の objc クラスがあることをコンパイラに伝えImageScrollViewます。

もちろん、前方宣言では、使用する#import場所で ImageScrollView も使用しない限り、使用する必要がある場所でインターフェイスが表示されません。

今、私は FullScreenViewController をサブクラス化し、ImageScrollView プロパティから任意のプロパティにアクセスしようとすると、「プロパティが見つかりません」というエラー メッセージが表示され続けます。ImageScrollView.h をサブクラスに追加すると機能しますが、これがわかりません。既に FullScreenViewController に ImageScrollView.h を追加しましたが、再度追加する必要があるのはなぜですか?

ImageScrollViewの宣言はサブクラスには見えませんFullScreenViewControllerSubclass。edImageScrollView.hの場所にのみ表示されます。には表示されません。したがって、そこに使用するには別のファイルを書き込む必要があります。#importFullScreenViewController.mFullScreenViewControllerSubclass.m#importFullScreenViewControllerSubclass.mImageScrollView

更新: 前方クラス宣言を使用するのではなく、ImageScrollView.h を FullScreenViewController.h に含めました。.h ファイルを含めるだけでなく、前方宣言を使用した理由について少し混乱していますか?

ビルド時間を短縮し、健全で制御された依存関係構造を実現するには、フォワードを使用します。これは元に戻すのに非常に時間がかかる問題です。プログラムやライブラリのサイズが大きくなるにつれて、この問題はさらに悪化します。

中規模のプロジェクトでヘッダーを変更して、50 ソースの再コンパイルを要求し、翻訳ごとに平均前処理済み入力が 150,000 行になるようにすることを希望しますか?それとも、翻訳ごとに平均前処理済み入力が 40,000 行の 6 つのソースに影響を与える変更を好むでしょうか? ? ここでの違いは、依存関係とインポートをどのように構造化したかに応じて、小さな変更では増分再構築が完了するまでに数秒から数分かかることです。

于 2012-05-12T20:25:18.283 に答える
0

エイリアス_scrollViewまたはscrollViewを使用してアクセスしようとしましたか。_scrollViewを使用してアクセスし、@classでは不十分なためuが.mまたは.hのファイルをインポートしたかどうかを確認する必要があります。

于 2012-05-12T06:32:34.423 に答える