2011-01-05 7 views
3

@private、@protected(デフォルト)、@publicの3つの修飾子があります。 C++や他のより純粋な言語で慣れているので、私はいつも自分のフィールドに@privateを使用します。 AppleのSDKの例では、これまでのところはほとんど見ていませんが、デフォルトのものに頼っているだけです。Objective-C:コードに@private visibility/access修飾子を使用していますか?

私はObjective-C継承がむしろ偽の特徴であることに気付きました。つまり、別のインターフェイスからインターフェイスを派生しても、すべてのプライベートフィールドが再定義できるようになったわけではありません。コンパイラはまだそれらを見て、OODの古典的なカプセル化パラダイムと直交する、同じ名前の新しいプライベートフィールドを定義することを禁止します。

私は少し不満です。たぶん私は言語より多くを期待しています。それは何よりも標準的なCを上回るものなのです。

あなたのコードには@privateを使用していますか?どうして?

+4

... C++ .... sane ?? .... notnotcompute ... –

+0

まあ、Objective Cの正気と比較して:私は主にC#を使っています。 – Schultz9999

+0

C++はObjective-Cと比べて穏やかではありません。 Objective-Cは小さくて小さな言語です。 :) –

答えて

2

私はそれは常に@privateを使用することをお勧めだと思うが、私は一般的にinitdealloc方法を除いて、ほぼすべてのIVARアクセスのプロパティアクセサを使用するので、私は過去に悩まさたことがありません。実際には、私は間違ってイヴァールにアクセスすることはほとんどありません。

また、iOS 4以降をターゲットにしている場合は、@synthesizeを使用する場合は、プロパティにivarsを宣言する必要はありません。


私は、あなたが他の開発者によってサブクラス化されることを意図しているライブラリのコードを書いている場合は、@privateの使用がより重要であることに注意してください。

+0

それは便利な情報です - 私はivarsがV4 +ではオプションであることを知らなかった。 – Schultz9999

+1

ええ、私はobject-> ivarを使用しないので、私は私のイーグルを私的にすることについて心配しません。 –

+1

プロパティはもはや正式にはイナバルを必要としませんが、それを持たないといくつかの[奇妙な振る舞い]になるようです(http://stackoverflow.com/questions/3336922/whats-the-purpose-of-an-ivar-when-a-プロパティが存在する/ 3958099#3958099)。 – Cris

1

これは、アップルや、ヘッダファイルで特定のフィールドだけを公開したいライブラリを出荷している人にとって、本当に便利です。アクセサーモデルは、あなたが望むものを公開する(または公開しない)ことができるため、決して使用しません。ヘッダーファイルとソースファイルの両方があるので、プライベートなのは本当ですか? Objective-CはC++ではないので、@privateは別の目的を持っています。

2

私は習慣から外れていますが、バイナリフレームワークを出荷しない限り、他の人がagianstをリンクしていない限り、実際には関係ありません。

すべて@privateは、[obj getter]またはobj.getterではなく、obj->_ivarのようにアクセスされるオブジェクト構造体のメンバーの可視性を制限します。あなたがクラス外でしようとするとエラーになるので、それはエラーです。直接構造アクセスを使用する唯一の場所は、NSCodingまたはNSCopyingを実装するときです。これらはまだ動作しますが、実際には購入しませんあなたはずっと。

+1

'@ private'は実際には' obj - > _ ivar'構造より少しだけ多くを制限します。サブクラスのメソッドでは、 '@ private'がなければ、' self - > _ parent_ivar'ではなく '_parent_ivar'のように、自分のivarsと同じように先祖のivarsに直接アクセスすることができます。 –

1

私は1989年以来、Objective-Cで書いたすべてのコードで、@ public、@protected、または@privateの使用を心配したことはありません。

関連する問題