3

重複の可能性:
Objective-cの「propertyname」と「self.propertyname」を介したプロパティへのアクセスの違いは?

私のクラスでは、次のようなプロパティのself.propertyを使用するかどうかわかりません

  dateFormatter = [[NSDateFormatter alloc] init];
  //or
  self.dateFormatter = [[NSDateFormatter alloc] init];

どちらも正常に機能しているようです。これら2つの使用法に違いはありますか?私は混乱しています。

4

2 に答える 2

3

プロパティはメソッドのgetterおよびsetterに面しており、self.dateformatorを介して呼び出すと、オブジェクトと自己生成のgetterおよびsetterの名前付け(setPropertyおよびgetProperty)を合成した場合に、プロパティが呼び出されます。

あなたの場合、最初の行はプロパティではありません。コードの2行目では、プロパティのgetterメソッドとsetterメソッドを使用しているときに、クラスのiVarに直接アクセスしています。

今あなたの質問は違いは何ですか、

違いは、iVarアクセス​​(最初の行)では、オブジェクトを手動で解放する必要があり、保持カウントが1増加し、割り当てられたメモリがそれに関連付けられることです。self.propertyにある間、メモリが割り当てられますが、アップルのプロパティ管理がこれを行うため、新しいブロックが変数に割り当てられます。ただし、保持カウントは再び同じになります。

そのため、メモリのブロックが失われます。

ここで、オブジェクトのプロパティを使用するのが良いアプローチであるという有益なことを伝えたいと思います。インターフェイスファイルのプロパティ属性にretainを書き込んだ場合、メモリ管理はコンパイラ側で行われますが、書くことを忘れないでください。 Deallocメソッドでリリースします。ここに書き込みがあるコード行の場合は、次のようになります。

self.someProperty = [[NSArray alloc] init];

として使用

NSArray* arr = [[NSArray alloc] init];
 self.someProperty = arr;
 [arr release];

これで、保持カウントは1つと同じになり、どこでリリースするかは気になりません。書き込みを行うと、deallocメソッドで自動リリースされます。

以前に書いたものについては、オブジェクトを解放する必要がある場所を追跡する必要があります

于 2012-05-05T12:56:20.530 に答える
2

setter関数とgetter関数を使用する場合は、実際にself.propertyを使用できます。これがプロパティの主な機能であり、自分でコーディングしなくても、setterメソッドとgetterメソッドを作成できます。今、あなたがセルを離れるなら。プロパティを使用するだけで、そのgetterまたはsetterメソッドにアクセスできなくなります。ただし、オブジェクトの割り当てと初期化では、steerメソッドまたはgetterメソッドを使用できないため、これは問題ではありません。それが両方の方法があなたのために働いている理由です。

' self.property 'は、プロパティのsetterメソッドとgetterメソッドにアクセスします。

' property 'は、プロパティのインスタンス変数にアクセスします。

于 2012-05-05T12:39:43.060 に答える