3

C# では、インスタンス変数を宣言してreadonly、宣言中またはそれが属するクラスのコンストラクターでのみ代入の対象となるように指定できます。

private readonly int _myInt;

Objective-C では、次のようにプロパティを読み取り専用として宣言できることを理解しています。

@property (readonly) int myInt;

ただし、これはプライベート アクセサーを持つ C# プロパティと同等でありset、対応するインスタンス変数が初期化後に "プライベートに" 再割り当てされることを防ぎません。

Objective-Cで C# の修飾子の動作を模倣する方法はありますか?readonlyインスタンス変数は、それを含むクラスのイニシャライザでのみ割り当てることができます (注:クラス初期化子、const修飾子は私のニーズに合わない)?

これが不可能な場合、Objective-C でこの動作が適切ではないという概念的な理由はありますか?

4

1 に答える 1

4

Objective-C は、究極的には、C ベースのポインターが豊富な言語です。したがって、特定のオブジェクトのインスタンスへのポインターを取得すると、オブジェクトの状態に直接アクセスして気まぐれに操作することができます。プロセス内で読み取り専用メモリを安全に強制する VM やその他のメカニズムがなければ、そのようなメカニズムは無効になる可能性があります。

このように、Objective-C はずっと前に、誤った安心感よりもシンプルさを選択していました。

readonly @propertyaのバッキング ストアの値をクラス外からリセットするには、非常に厄介なことを行う必要があります。クラスの public で宣言されていないメソッドを呼び出し@interfaceたり、ランタイム API をいじったり、さらに悪いことをしたりします。

したがって、最終的には、そのような機能は正確には追求されませんでした。その理由は、それを行うと多くのエンジニアリング マンパワーが消費され、言語のセキュリティが実際には向上せず、言語自体がより複雑になる (追加のキーワードを使用)および覚えておくべきルール)。

関連して、この質問/回答を参照してください: なぜ Objective-C はプライベート メソッドをサポートしないのですか?

于 2013-05-30T23:57:57.400 に答える