NSViewController用のXcodeによって生成された複数の@Interface宣言は?
-
21-12-2019 - |
質問
Cocoaアプリケーションを作成し、様々なコード生成のためにXcodeを使用しています。UViewをサブクラス化するための.hファイルと.mファイルを生成するのに問題ありませんが、iサブクラスuiviewController iがendに@interface
を持ちます。
//in MyViewController.h
@interface MyViewController : NSViewController <MyViewDelegate>
@end
.
しかし
//in MyViewController.m
@interface MyViewController ()
@end
@implementation MyViewController
@end
.
まだ罰金をまとめた。したがって、これが正常な動作であると仮定すると、次のようなものがあります。 (a)なぜこれが起こるのか、そして (b)結果とは何ですか - 特にコンパイル注文の点で?
ありがとう!
解決
uiviewControllerが@ Interface宣言を取得した場合、.mファイルの場合は()
が存在します。
気づいたように、2つのインターフェースブロックはでは同一です.()
は重要です。()
を持つ1つは、名前なしのカテゴリと似ています。カテゴリとクラスの拡張子の2つの重要な違いは次のとおりです。
-
クラス拡張子にインスタンス変数を宣言することはできますが、カテゴリ内ではできません。
-
クラス拡張は、実装ブロックと同じファイルに表示されなければなりません。
クラス拡張機能は、実装に固有のメソッドや変数など、ヘッダファイルに公開したくないメソッドを宣言するのに役立ちます。
他のヒント
あなたはカテゴリーに精通していますか?あなたが観察しているものは似ていますが、カテゴリから重要な区別を持っています。ここでの違いは、それが匿名であること(したがって空白)で、元のクラスがコンパイルされているのと同時にコンパイルされることです。その後の部分は重要な部分です。これは、インスタンスプロパティ(Storage)を追加できます。これは最も一般的に「内部のみ」または「プライベート」の方法とプロパティを宣言するために使用されます。しかし、実行時に「プライベート」の執行の概念がないことに留意してください、それはあなたが公開されていないvs.を公開したのかということです。これは、コアクラスの実装ファイルを作成した人にのみ「公開」したインターフェイスを非常に明確に定義されている方法です。