2011-12-26 7 views
2

didSelectRowAtIndexPathを使用しているtableViewでviewControllerをプッシュすると、iOS 4.3でクラッシュする原因がわかりますが、iOS 5.0以降では問題なく動作します。オブジェクトdeallocがiOS 4.3でクラッシュするだけです。

それは私が呼んで右のときにクラッシュ:

self.customViewController = [[[CustomViewController alloc] initWithNibName:@"CustomViewController"bundle:nil] autorelease]; 

いつでもcustomViewControllerが押された最初の時間後。

@property (nonatomic, retain) CustomViewController *customViewController; 

-(void) dealloc // Dealloc of tableView. 
{ 

[customViewController release]; 
customViewController = nil; 

} 


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

self.customViewController = [[[CustomViewController alloc] initWithNibName:@"CustomViewController"bundle:nil] autorelease]; // Release old, allocate new, set it. 

[[self navigationController] pushViewController:customViewController animated:YES]; 
[customViewController release]; // Balance out pushViewController's retain. 


} 

ありがとう:

は、ここに私の関連するコードです。

答えて

2
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
self.customViewController = [[[CustomViewController alloc] initWithNibName:@"CustomViewController"bundle:nil] autorelease]; 
[[self navigationController] pushViewController:customViewController animated:YES]; 
[customViewController release]; // Balance out pushViewController's retain. ---->NO 
} 

最後のreleaseは不要な余分なものです。
には既にretain countが1つ下がっています。


私たちは、あなたがCustomViewControllerを作成

self.customViewController = [[[CustomViewController alloc] initWithNibName:@"CustomViewController"bundle:nil] autorelease]; 

この行を分析しますあなたはそれにautoreleaseはとてもカウントは、実行の0以降(おそらく最後になる保持言う1.
カウント==を保持ループは)しかし、今のところそれはまだ1になっているので、まだアクセスできるのですが、0として扱います。
その後、self.customViewControllerと言って、そのプロパティは保持されますので、count == 1を保持してください。 そして、あなたのdealloc。
ご意見として:

//バランスアウトpushViewControllerの保持。

Balanceこれらは、YOU ownの1つだけの残高です。システムがオブジェクトに保持されている場合は、システムがオブジェクトを必要としなくなった時点でオブジェクトを解放します。

+0

真剣に待ちますか? viewControllerを保持していると本当に思っていましたが、ビューを保持していると思いますか? –

+0

@JoeRaytheinビューコントローラは保持されますが、リリースされます。それはそれの所有権が必要です。autoreleaseを呼び出すと、すでに所有権を放棄しています。 –

+0

しかし、私は 'release'は、コントローラがプッシュされているときにアプリケーションをクラッシュさせてはならないと思っています。' didSelectRowAtIndexPath'ではなく 'dealloc'メソッドでクラッシュさせるべきです。 – Ecarrion

1

customViewControllerを解放しないでください。既に割り当てられているときに自動レリースしているので、既にallocから所有権を放棄しています。オブジェクトを再度リリースしたり、自動解放したりする必要はありません。ナビゲーションコントローラは所有権を持ち、適切な時点でそれを放棄します。

また、あるバージョンではなく別のバージョンでも表示される可能性があります。これはメモリ管理上の問題です。そのため、アプリケーションを実行するたびに、デバイスのメモリの状態に依存します(クラッシュなど)。常にSkypeを起動してからPhotosアプリを開く前にクラッシュすることがあります。

デバッグセッション中にゾンビを有効にすることをお勧めします。ゾンビを有効にすると、オブジェクトは決して解放されません。代わりにゾンビ状態になり、再びメッセージを送信した場合は、アプリを中止して、メモリの問題をデバッグするのに役立つ迷惑メールの送信先を表示します。

+0

非常に有益な、ありがとう男。私は自分の道の誤りを見る! –

関連する問題