2011-07-06 3 views

答えて

2

あなたのクラスの場所によって異なります。 init(およびdealloc)メソッドを使用している場合は、setterロジックの副作用を避けるためにivarを直接参照することをお勧めします。したがって、私はやりたいと思います。

_blueViewController = [[BlueViewController alloc] initWithNibName:@"BlueView" bundle:nil]; 

しかし、それ以外はどこでも私はそれをやっています。その後、getter/setterにカスタムロジックがある場合は、それが実行されることがわかります。保持のために合成セッターはこれに似たいくつかのメモリ管理を行いますVladimarのポイント@上eleborateする

- (void)setMyObject:(MyObject *)newMyObject 
{ 
    // If it's the same object we don't need to do anything 
    if (_myObject != newMyObject) { 
    [newMyObject retain]; 
    [_myObject release]; 
    _myObject = newMyObject; 
    } 
} 

ゲッター/セッターはすべてこのロジックについては、いつでもあなたを心配させるために、はるかに安全ですあなたのイヤーズをセットしてください。

2

iVarは直接初期化できますが、以前のblueViewController値のメモリ管理も処理できます。 iVarに直接アクセスするには、新しい値を割り当てる前に手動で前の値を解放する必要があります。

1

必要に応じて、すべて1行で入力できます。重要なことは、+ allocと-releaseまたは-autoreleaseとのバランスを取ることです。大丈夫です

self.blueViewController = [[[BlueViewController alloc] initWithNibName:@"BlueView" bundle:nil] autorelease]; 

を、いくつかの人々は-autoreleaseを避けることを好む、と一部の人々はただ単純段階および/またはコードの短い行を好む:だから、あなたが言うことができます。あなたが行ったように中間変数を使用することは、その点で役立ち、何の費用もかかりません。

1

プロパティがretainであるかどうかによって異なります。ほとんどのオブジェクトのプロパティは保持されます。これは、保持プロパティが次のようになります。

- (void)setBlueViewController:(BlueViewController *)bvc { 
    if (bvc != blueViewController) { // blueViewController is local ivar 
     [blueViewController release]; 
     blueViewController = [bvc retain]; 
    } 
} 

したがって、あなたは+ 2の保持カウントを作成しています。 initのときは+1です。プロパティはretainです。それを+2まで上げてください。あなたのdeallocがそれを一度解放すると+1になります...あなたはその財産を漏らしました。変数がalloc/initであるため、セッターを使用したくありません。代わりに、インスタンス変数に直接代入してください。

これを直接インスタンス化することで、他のコード行のエラーを減らすことができます。release例えば、あなたは大量のクラスを保持しているので、事故でretainをタイプしてプログラムがクラッシュするまでそれを認識できませんでした。

もちろん、Calebは自動解放できると言っていますが、実行ループが終了するまでメモリに保存します。それははるかに簡単で、あなたはそれを心配することなく、より多くのコントロールを提供します。 ivarにalloc/initを割り当てることには何も問題ありません。実際、それはそれを行う最善の方法です。

関連する問題