2009-08-01 12 views
2

多くのAppleのコード例の1つから少しのコードを実装しましたが、プロパティのうち1つのretain属性が機能していないため、少し問題があります。ここではプロパティの宣言です:プロパティの属性「retain」が機能していないようですか?

@property (nonatomic, retain) EditingViewController *editingViewController; 

そしてここでコードは次のとおりです。

- (EditingViewController *)editingViewController { 
    // Instantiate the editing view controller if necessary. 
    if (editingViewController == nil) { 
     EditingViewController *aController = [[EditingViewController alloc] init]; 
     editingViewController = aController; 
     [aController release]; 
    } 
    return editingViewController; 
} 

私は(保持)が保持カウントが割り当てに1ずつ増加する原因になるとされていることを理解し、しかし、私はに送信しないと、コードが失敗します。 [aController release]を送信しないでください。私はここで何が欠けていますか?

答えて

4

editingViewControllerを参照すると、self->editingViewControllerに相当します。つまり、ivarへのアクセスです。

ゲッターまたはセッターを使用する場合は、、またはそれに相当する[self setEditingViewController:aController]を使用する必要があります。

私は、たとえば、プロパティに別の名前でIVARを使用することを好む理由です:

EditingViewController* i_editingViewController; 

@property (nonatomic, retain) EditingViewController *editingViewController; 

@synthesize editingViewController = i_editingViewController; 

次に、あなたのようにあなたの怠惰なゲッターを書き込むことができます。

- (EditingViewController *)editingViewController { 
    // Instantiate the editing view controller if necessary. 
    if (i_editingViewController == nil) { 
     i_editingViewController = [[EditingViewController alloc] init]; 
    } 
    return i_editingViewController; 
} 

または

- (EditingViewController *)editingViewController { 
    // Instantiate the editing view controller if necessary. 
    if (i_editingViewController == nil) { 
     EditingViewController *aController = [[EditingViewController alloc] init]; 
     self.editingViewController = aController; 
     [aController release]; 
    } 
    return i_editingViewController; 
} 

という値が設定されているため、以前の方法(セッターを呼び出さない)を使用している可能性があります。(実際には変更されていませんが)いずれの方法もうまく動作し、異なる名前(ivarとプロパティ)が混乱や誤った誤用を避けるのに役立ちます。また、プロパティを使用することを奨励しています(わずかな接頭辞を避けるため)。

Appleは_接頭辞を予約しており、セッターとゲッタはinit/deallocルーチンでは使用しないでください。

+0

コード例は実際に私の方法のエラーを見るのに役立ちました。私はこれをトラブルシューティングしていたとき、私はself.editingViewControllerを3つのインスタンスすべてで使用しようとしていましたが、もちろんそれらのうちの2つに対してtableView:editingViewControllerを再帰的に呼び出していました。ダー。 – JoBu1324

0

プロパティを使用するには、self.editingViewControllerと記述する必要があります。 self.editingViewControllerは[self setEditingViewController:...]と等価であり、適切なretain/releaseジョブを実行するのに対し、 "editingViewController"はClassメンバ変数への直接アクセスです。

関連する問題