プロパティとプライベートおよび拡張クラスのインターフェイスの混乱の混乱
-
19-09-2019 - |
質問
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
ブロック。
所属していません StackOverflow