2011-06-18 4 views
0

タイトルはすべてを言います!self.propertyNameとpropertyNameの違いは何ですか?

Objective-Cでは、self.propertyNamepropertyNameの違いは何ですか?

+2

検索機能が壊れていますか?これはすでに何十回も尋ねられ答えられているに違いない。 -------> – Roger

+0

@rogerの関連記事をここでチェックしてください。質問と質問に同じタイトルと質問を貼り付けてみてください。 :) – necixy

+2

..私はどこからでも壊れていません;-) – Roger

答えて

2

self.propertyNameが1で保持カウントをincrese

propertyNameのは、アプリケーションのクラッシュにつながる可能性がカウント保持を増加させないであろう。

e。 g。 、

@property (nonatomic,retain) NSString* propertyName; 

あなたはnamePropertyNSStringのオブジェクトを持って言うことができます。 以下では、保持カウントを1増加させ、self.propertyNameを使用してreleaseを呼び出すことができます。 does'nt増加以下

self.propertyName = nameProperty; 
[nameProperty release]; 

アプリケーションでpropertyNameのを使用している場合、それはあなたのアプリケーションのクラッシュが発生しますので、カウントを保持しています。

propertyName = nameProperty; 
[nameProperty release]; 

さらにpropertyNameを使用するとクラッシュする可能性があります。

+0

'BOOL'や' NSInteger'や 'CGFloat'などの非オブジェクト型のメモリ管理は行われません。 – Abizern

+0

@アビザン:どうしてダウンボート?正当な理由ではなく、NSObjectsのプロパティを保持したままでNSObjectsの例を与えてくれたので注意して読んでください。また、受け入れられています:(基本的な型で 'retain'を持つことの重要性を自問してください... – Jhaliya

+0

特定のケースオブジェクトを保持するだけではなく、retainCountを参照することは誤解を招きます。オブジェクトの保持カウントは考慮しないで、所有するオブジェクトを解放することを心配してくださいあなたが渡しているオブジェクトが静的な文字列の場合はどうでしょうか? 'retainCount'の値は増加しませんが、' retain'されています。 – Abizern

1

selfを呼び出すと、プロパティを所有するクラス/オブジェクトを呼び出すことができます。

あなたもこれが役立つことがあります。

Assigning to self in Objective-C

4

self.propertyNameは、それがゲッター/セッターなどを経ることを意味し、propertyNameの価値のためにそれを求めて、オブジェクトにメッセージを送っているpropertyName getter/setterをバイパスして直接ivarにアクセスしています。 Here's an articleはかなり詳細に入ります。プロパティ宣言に保つよう、あなたがpropertyNameを指定した場合

2

自己あなたの可能性が合成されたアクセサメソッドを介して実行、プロパティ

を使用している場合

すなわちself.propertyName = NEWNAMEは、[自己setPropertyName:NEWNAME]と同じである

propertyNameの= NEWNAMEがにあなたを引き起こすので、これは、メモリ管理のために重要になりますプロパティ名の前の内容への緩やかな参照

1

ドット表記法は、コンパイラによってメソッド呼び出しに変換されます。つまり、実行時に、スタックメモリとの間で何かをコピーしたり、マシンコードでジャンプを実行したりするなど、このメソッド呼び出しを実行するための余分な作業があります。

インスタンス変数は、基本的にメモリアドレスまたはスカラー値(intなど)であるため、より高速です。

あなたが何かをするために余分なレイヤーが必要な場合や、必要な場合は、self.something表記が好まれます。最初に渡されたオブジェクトを保持するか、オブジェクトを最初に必要なときにインスタンス化するかのようにします。

0

プロパティの値を設定するだけで、アクセサまたは合成アクセサを経由せずにプロパティの値を直接設定できます。

アクセサーを呼び出すことにより、selfを介してアクセサーを経由します。 retainまたはcopyで宣言されたプロパティの場合は、retainまたはcopyの値が渡されます。オブジェクト以外のプロパティの場合、通常の宣言はassignです。つまり、これらのiVarsにメモリ管理が適用されていません。

両方のタイプのコールがありますが、selfの呼び出しはこれらのメソッドでは推奨されないため、イニシエータとdeallocメソッドで直接メソッドを使用することをお勧めします。

プロパティを宣言して合成した場合は、selfを呼び出すと、その変数の変更についてKVO通知が生成されます。これにより、willChangeValueForKey:didChangeValueForKey:メソッドを記述する必要がなくなります。

+0

上記のすべての回答をまとめてください... – Jhaliya

+0

なぜこれを下げますか?補償するためにアップボーニング。 – Altealice

+0

違反はありません、**ここで**報復**のような単語は使用しないでください。私の側から個人的なものはありません。あなたが終わりではわかりませんが、Plz do'ntはここで人を欺いています。私たちはコミュニティ開発者をサポートするためにここにいます。答えの夏ではなく、 – Jhaliya

関連する問題