タイトルはすべてを言います!self.propertyNameとpropertyNameの違いは何ですか?
Objective-Cでは、self.propertyName
とpropertyName
の違いは何ですか?
タイトルはすべてを言います!self.propertyNameとpropertyNameの違いは何ですか?
Objective-Cでは、self.propertyName
とpropertyName
の違いは何ですか?
self.propertyName
が1で保持カウントをincrese
propertyNameのは、アプリケーションのクラッシュにつながる可能性がカウント保持を増加させないであろう。
e。 g。 、
@property (nonatomic,retain) NSString* propertyName;
あなたはnameProperty
NSStringのオブジェクトを持って言うことができます。 以下では、保持カウントを1増加させ、self.propertyNameを使用してrelease
を呼び出すことができます。 does'nt増加以下
self.propertyName = nameProperty;
[nameProperty release];
アプリケーションでpropertyNameのを使用している場合、それはあなたのアプリケーションのクラッシュが発生しますので、カウントを保持しています。
propertyName = nameProperty;
[nameProperty release];
さらにpropertyName
を使用するとクラッシュする可能性があります。
'BOOL'や' NSInteger'や 'CGFloat'などの非オブジェクト型のメモリ管理は行われません。 – Abizern
@アビザン:どうしてダウンボート?正当な理由ではなく、NSObjectsのプロパティを保持したままでNSObjectsの例を与えてくれたので注意して読んでください。また、受け入れられています:(基本的な型で 'retain'を持つことの重要性を自問してください... – Jhaliya
特定のケースオブジェクトを保持するだけではなく、retainCountを参照することは誤解を招きます。オブジェクトの保持カウントは考慮しないで、所有するオブジェクトを解放することを心配してくださいあなたが渡しているオブジェクトが静的な文字列の場合はどうでしょうか? 'retainCount'の値は増加しませんが、' retain'されています。 – Abizern
self.propertyName
は、それがゲッター/セッターなどを経ることを意味し、propertyName
の価値のためにそれを求めて、オブジェクトにメッセージを送っているpropertyName
getter/setterをバイパスして直接ivarにアクセスしています。 Here's an articleはかなり詳細に入ります。プロパティ宣言に保つよう、あなたがpropertyName
を指定した場合
自己あなたの可能性が合成されたアクセサメソッドを介して実行、プロパティ
を使用している場合すなわちself.propertyName = NEWNAMEは、[自己setPropertyName:NEWNAME]と同じである
propertyNameの= NEWNAMEがにあなたを引き起こすので、これは、メモリ管理のために重要になりますプロパティ名の前の内容への緩やかな参照
ドット表記法は、コンパイラによってメソッド呼び出しに変換されます。つまり、実行時に、スタックメモリとの間で何かをコピーしたり、マシンコードでジャンプを実行したりするなど、このメソッド呼び出しを実行するための余分な作業があります。
インスタンス変数は、基本的にメモリアドレスまたはスカラー値(intなど)であるため、より高速です。
あなたが何かをするために余分なレイヤーが必要な場合や、必要な場合は、self.something表記が好まれます。最初に渡されたオブジェクトを保持するか、オブジェクトを最初に必要なときにインスタンス化するかのようにします。
プロパティの値を設定するだけで、アクセサまたは合成アクセサを経由せずにプロパティの値を直接設定できます。
アクセサーを呼び出すことにより、self
を介してアクセサーを経由します。 retain
またはcopy
で宣言されたプロパティの場合は、retain
またはcopy
の値が渡されます。オブジェクト以外のプロパティの場合、通常の宣言はassign
です。つまり、これらのiVarsにメモリ管理が適用されていません。
両方のタイプのコールがありますが、self
の呼び出しはこれらのメソッドでは推奨されないため、イニシエータとdealloc
メソッドで直接メソッドを使用することをお勧めします。
プロパティを宣言して合成した場合は、self
を呼び出すと、その変数の変更についてKVO通知が生成されます。これにより、willChangeValueForKey:
とdidChangeValueForKey:
メソッドを記述する必要がなくなります。
検索機能が壊れていますか?これはすでに何十回も尋ねられ答えられているに違いない。 -------> – Roger
@rogerの関連記事をここでチェックしてください。質問と質問に同じタイトルと質問を貼り付けてみてください。 :) – necixy
..私はどこからでも壊れていません;-) – Roger