私は Obj-c と Cocoa で数年の経験がありますが、Obj-C 2.0 などの進歩に戻ってきたばかりです。
私は最新のランタイムとプロパティの宣言などに頭を悩ませようとしています。私を少し混乱させることの 1 つは、最新のランタイムで iVar を暗黙的に作成できることです。そしてもちろん、これはコード内で常に self.property を使用して値にアクセスする必要があることを意味します。
ただし、init* および dealloc (GC を使用していないと仮定) メソッドでは、(現在のランタイムで) iVar を直接使用する必要があります。
質問は次のとおりです。
init* でプロパティ アクセサーを使用し、最新のランタイムで dealloc を使用する必要がありますか?
もしそうなら、なぜこれは違うのですか?コンパイラが iVar を認識できないからですか?
アクセサーをオーバーライドする必要がある場合、実行時に定義される iVar に引き続きアクセスできますか? または、ランタイムが使用する実際の iVar を定義する必要がありますか?
繰り返しますが、合成された iVar にアクセスできる場合、 init* および dealloc メソッドに対してこれを続けられないのはなぜですか?
ドキュメントを何度か読みましたが、これらすべてについて少し曖昧に思えたので、どのようにコーディングを続けたいかを決定するために、よく理解していることを確認したいと思います。
私の質問が明確であることを願っています。
テストの簡単な要約:
レガシーでivarを宣言しないと、コンパイラは完全に不満です
#ifndef __OBJC2__
レガシーコンパイラで ivarを使用する場合は満足であり、 ivar を直接およびプロパティとして使用できます最新のランタイムでは、ivar を未定義のままにして、プロパティとしてアクセスできます
最新のランタイムでは、宣言なしで ivar に直接アクセスしようとすると、コンパイル中にエラーが発生します
@private
もちろん、ivar の宣言により、レガシーとモダンの両方で ivar に直接アクセスできます。
今のところ、前に進むための明確な方法を本当に提供していませんか?