2011-02-10 4 views
0

UIView addTargetを使用するかどうかについては混乱します。action:そのビューを保持させます。具体的には、ビューコントローラ上のイベントに登録されているカスタムセルビューを持つUITableViewがあります。これらのセルビューは自動再生されます。オートリリースとセレクタ

UITableViewCell *cell = [aTableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 

UIView *cellView = [[UIView alloc] initWithFrame:viewRect]; 


[cellView addTarget:self action:@selector(dosSomething:) forControlEvents:UIControlEventTouchUpInside]; //is this not a good idea? 

[cellView autorelease]; //will this get released? 
} 

答えて

1

addTarget:action:forControlEvent:ビューの保持カウントには何ら影響しません。あなたがautoreleaseと呼ぶ方法は現在問題ありません。あなたのビューは自動解放プールに配置され、最終的に解放されます。

ビューを有効にするには、他のビュー(セルなど)にサブビューとして追加する必要があります。そのビューはあなたのビューの所有権を取るためそこに保持されますが、autoreleaseをここで呼び出すと、正しく処理されます。

+0

ありがとうございました。私は、イベントリスナーがVMのガベージコレクションを防ぐことができるActionScriptの世界から来ています。ここで少し編集的になっています。 – akaru

+0

しかし、NSNotificationCenter addObserver:私が述べたとおり、オブジェクトを保持することはできますか? – akaru

+0

@akaru:これは実装の詳細なのでわかりませんが、オブザーバーの割り当てを解除するのと同じように、それを削除する必要があるので、私もあなたのラインに沿って推測しています。 – BoltClock

0

ここでcellViewをリリースすることができます。 cellViewのリリースに問題はなく、クラッシュすることはありません。しかし、このビューを関数の後半で使用していないことを確認し、cellViewを解放する前にcellViewをセルのコンテンツビューに追加してください。

UITableViewCell *cell = [aTableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 

UIView *cellView = [[UIView alloc] initWithFrame:viewRect]; 


[cellView addTarget:self action:@selector(dosSomething:) forControlEvents:UIControlEventTouchUpInside]; //is this not a good idea? 

[cell.contentView addSubView:cellView]; 

[cellView release]; //will this get released? 
} 

これは完全に機能します。