プロパティとプライベートおよび拡張クラスのインターフェイスの混乱の混乱

StackOverflow https://stackoverflow.com/questions/1718673

質問

AA-Plotチャートのサンプルコードをダウンロードしました。

.hファイルの1つ:

@interface MainViewController : UIViewController <APYahooDataPullerDelegate, CPPlotDataSource> {
    CPLayerHostingView *layerHost;
@private
    APYahooDataPuller *datapuller;
    CPXYGraph *graph;
}    
@property (nonatomic, retain) IBOutlet CPLayerHostingView *layerHost;
@end

.mファイルでは、インターフェイスが再び宣言されますか?

@interface MainViewController()

@property(nonatomic, retain) CPXYGraph *graph;
@property(nonatomic, retain) APYahooDataPuller *datapuller;

@end

サンプルプロジェクトのメインビューコントローラーコードで上記のコードを見つけました。

私が次のことをするなら、 上記のコードと以下のコードの違いは何ですか?

@interface MainViewController : UIViewController <APYahooDataPullerDelegate, CPPlotDataSource> {
    CPLayerHostingView *layerHost;
    APYahooDataPuller *datapuller;
    CPXYGraph *graph;
}    
@property (nonatomic, retain) IBOutlet CPLayerHostingView *layerHost;
@property(nonatomic, retain) CPXYGraph *graph;
@property(nonatomic, retain) APYahooDataPuller *datapuller;
@end
役に立ちましたか?

解決

.mファイルに表示されている「余分な」ものは カテゴリー. 。元のプログラマーは、おそらく彼のクラスのパブリックインターフェイス(.hファイル)から彼の実装の詳細の一部を非表示にしたかったので、彼はカテゴリを作成しました(この場合は無名です。そのため、内部には何もありません。 ())彼の実装ファイルにそれらを追加します。この特定のケースでは、外部コードがそれらに到達できないように、彼はプライベート変数のアクセサを隠しています。

2番目のコードスニペットに表示される変更は、すべてを単一のクラスインターフェイスに入れました。これらの変更は、ランタイム操作にまったく影響しないはずです。 (あなたが取り出したことを除いて @private, 、それは意図的でしたか?)セマンティックの違いは、カテゴリメソッドが実行時にクラスに追加されることです。

カテゴリは、インスタンス変数ではなくメソッドのみを追加できます。そのため、元のコードには、元のコード(「秘密」アクセサーズがあるものでも)がすべてのインスタンス変数宣言があります。 @interface ブロック。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top