ARC では、インスタンス変数ではなくプロパティでサポートされる唯一のモードは、プロパティを使用するcopy
必要がある場合ですcopy
。
@implementation
セクションでプライベート インスタンス変数を宣言すると、次のようになります。
@implementation MyClass
{
// private instance vars
}
その場合、クラス外からそれらにアクセスするにはかなりの労力が必要です。あなたが言うように、「プライベート」プロパティにアクセスするには、その名前を推測するか、ライブラリ呼び出しを使用するだけです。
セキュリティのためにそれは価値がありますか?YMMV。しかし、それは良いコーディング方法です。
補遺
コメント トレイルが示すように、私の真剣な取り組みについては多くの議論がありました。
まず明確にしましょう。Objective-C は C ファミリーの言語です。これらはすべて、プログラマーが言語内にとどまりながら、選択したほぼすべてのものを使用できるようにします[*] - これらは、強い型付け、アクセスが必要な場合に選択する言語ではありませんコード内の制限など。
第二に、「努力」は絶対的な尺度ではありません!したがって、「深刻」ではなく、「明白」という言葉を選んで修飾するべきだったのかもしれません。プライベート プロパティにアクセスするには、オブジェクトが型を持つ標準的なメソッド呼び出しを使用するだけでid
済みます。呼び出されるメソッドが隠されているコードにはほとんど手がかりがありません。プライベート変数にアクセスするには、API 呼び出し (ランタイム関数または KVC 呼び出し) または何らかのポインター操作が必要です。結果のコードは、標準の変数割り当てとはまったく異なります。そのため、より明白です。
つまり、 を必要とする使用を除けばcopy
、ARC では、プライベート インスタンス変数で十分な場合にプライベート プロパティを使用する正当な理由はありません。プライベート変数のfred
比較:
self.fred = 42; // property access, may involve a call (if not optimised out)
_fred = 42; // common way to bypass the accessors and get at the underlying var
fred = 42; // direct access
正しい答えはありませんが、間違った答えもありません-これは意見の領域です (もちろん、それは意見です ;-))。私はしばしば最後のもの、プライベート変数 - クリーンでシンプルなものを選びます。ただし、@RobNapier は彼の回答でプロパティの使用を好みます。
[*] 注: アセンブラーで記述された外部コードへのリンクを検討すると、すべての賭けは任意の言語で行われます。その時点で、保護を提供するために「ハードウェア」(実際または仮想)および/または「OS」を確認する必要があります。