1

現代のランタイムでは。次のようなインターフェイスでivarがすでに宣言されていなくても、プロパティを宣言できます。

@interface MyClass: NSObject
{
     NSString *str2;
}
@property (retain) NSString *str1;
@property (retain) NSString *str2;
@end

self.str1そして、私は知っています、実装では、両方または純粋にアクセスできるので、これは自動的にstr1ivarを生成しますstr1

しかし、私の質問は、str1とstr2の間に違いはありますか?

それらが同じである場合、クラス拡張(名前のないカテゴリ)がivarを生成するが、クラス拡張にivarインスタンスを追加することを許可しない新しい宣言されたプロパティを追加できるのはなぜですか?(LLVM2.0以降では許可されています)これですが、gccはしません)

4

1 に答える 1

0

str1 と str2 は同じです。@property を使用すると、セッター メソッドとゲッター メソッドが自動的に生成されますが、値を保存するインスタンス変数が存在しない場合は、同じ名前のインスタンス変数も作成されます。たとえば、あなたのコードでは、コンパイラは「プログラマーがアクセスしたいので、クラス NSString のインスタンスを作成する必要があるようです」と言うでしょう。ただし、str2 では、データを格納するためのインスタンス変数が既に作成されているため、コンパイラがインスタンス変数を作成する必要はありません。

個人的には、@interface で変数を宣言せずに、str1 で行ったようにコーディングします。

お役に立てれば。

これもチェックしてください:プロパティが存在する場合の ivar の目的は何ですか?

于 2012-06-04T01:48:54.217 に答える