「Xcodeの新機能」を読みましたが、この機能の正式な説明が見つかりません。公式の説明はどこにありますか?どのドキュメントですか?ありがとう。
4 に答える
省略しても、ivarメソッドとgetterメソッドおよびsetterメソッドが自動生成されることを意味すると仮定します@synthesize
。これは、デフォルトのプロパティ合成、自動プロパティ合成、およびプロパティ自動合成とさまざまに呼ばれます。
ドキュメントはあまりありません。私が見つけた限りでは、それがどのように機能するかについての公式の文書はなく、それが存在するという事実だけです。
これは実際にはclang機能であり、Xcode機能ではありません。Xcode 4.0 DP 4に同梱されているバージョンclangに一時的に表示されましたが、バグのためにすぐに削除されました。Xcode4.4に同梱されているバージョンのclangで再表示されました。 これがそれを追加したコミットだと思います。
これは、 Objective-Cの機能可用性インデックスに記載されています。
これは、 Clang言語拡張機能でも言及されています。
実験から:
プロパティを明示的に指定せずに
@synthesize
インスタンス変数を生成すると、宣言されたプロパティと同じタイプ(および、ARCでは所有権資格)のivarが自動的に生成されます。ivar名は、アンダースコア(_
)の後に宣言されたプロパティ名が続きます。プロパティを明示的に指定せず、明示的なgetterメソッドを含める場合、clangは自動的にivarを生成しません。
@synthesize
readonly
プロパティを明示的に指定せず、明示的なゲッターと明示的なセッターの両方を含める場合も、clangは自動的にivarを生成しません。
@synthesize
readwrite
しかし、私はこれらの振る舞いの公式文書を知りません。
これは、Appleのドキュメント「Objective-Cプログラミング言語:宣言されたプロパティ」の「プロパティ実装ディレクティブ」にあります。ivarが自動的に合成されるかどうかは、使用しているランタイムによって異なります。
ランタイムに依存するアクセサ合成の動作には違いがあります(「ランタイムの違い」も参照)。
- レガシーランタイムの場合、インスタンス変数は現在のクラスの@interfaceブロックですでに宣言されている必要があります。プロパティと同じ名前のインスタンス変数が存在し、そのタイプがプロパティのタイプと互換性がある場合は、それが使用されます。そうでない場合は、コンパイラエラーが発生します。
- 最新のランタイム(Objective-Cランタイムプログラミングガイドの「ランタイムバージョンとプラットフォーム」を参照)の場合、インスタンス変数は必要に応じて合成されます。同じ名前のインスタンス変数がすでに存在する場合は、それが使用されます。
iOSは常に最新のランタイムを使用するため、ivarを明示的に宣言する必要はありません。
これは実際にはコンパイラの一部です。
LLVM
あなたは仕様のウェブサイトでそれを読むことができます。
ココアのコーディングガイドラインにも注意を向けたいと思います。
パブリックインスタンス変数を明示的に宣言することは避けてください。
開発者は、オブジェクトがデータを格納する方法の詳細ではなく、オブジェクトのインターフェイスに関心を持つ必要があります。宣言されたプロパティを使用し、対応するインスタンス変数を合成することで、インスタンス変数を明示的に宣言することを回避できます。