0

次のコードを書きました。

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

GameViewController *gameViewController = [[GameViewController alloc]initWithLevelNumber:([levelGroup intValue]*100+indexPath.row) Bonus:NO];

NSLog(@"Retain Counter =%d",gameViewController.retainCount);

[navController pushViewController:gameViewController animated:YES];
[gameViewController release];

NSLog(@"Retain Counter=%d",gameViewController.retainCount);

[tableView deselectRowAtIndexPath:indexPath animated:YES];
}

2 つのログの結果は、順番に16です。これはどのように可能ですか?alloc メソッドを 1 回だけ呼び出し、コントローラーをスタックにプッシュした後に解放します。alloc-> +1、push-> +1、release-> -1 = 1 かどうか?

スタックからポップするときに、View Controller の割り当てを解除したいのですが..

4

4 に答える 4

6

この質問を明確にするために、このメモをお読みください。これはNSObject Protocol Referenceの一部です:

重要:通常、この方法は、メモリ管理の問題をデバッグする際には役に立ちません。オブジェクトへの参照を保持するために任意の数のフレームワーク オブジェクトがオブジェクトを保持している可能性があると同時に、自動解放プールがオブジェクトの任意の数の延期されたリリースを保持している可能性があるため、これから有用な情報を取得できる可能性はほとんどありません。方法

NSObject プロトコル リファレンス。RetainCount の説明

于 2012-03-04T13:09:27.790 に答える
1

次のように、GameController の作成を自動解放します。

GameViewController *gameViewController = [[[GameViewController alloc]initWithLevelNumber:([levelGroup intValue]*100+indexPath.row) Bonus:NO] autorelease];

次に削除し[gameViewController release]ます。その後、コードはコーシャに見えgameViewController、nav スタックからポップされた後に自動解放されます。心配する必要はありません。View retainCountController をプッシュすると、必要に応じて/UIKitが引き継ぎます。コードについて心配する必要があります。実際、あなたが書いた方法は問題ないはずです。ここでの提案により、コードがよりきれいになると思います。retainrelease

Instruments でgameViewControllerオブジェクトのメモリ リークが発生していない限り、心配する必要はないと思います。

于 2012-03-04T12:58:23.897 に答える
1

これは、内部的に (pushViewController: メソッドによって) いくつかの保持があるためです。特に、sdk 呼び出しメソッド間の保持カウントを確認する場合は、保持カウントを確認するのではなく、所有しているオブジェクトを解放することのみを確認してください。

于 2012-03-04T13:03:16.993 に答える
0

GameViewController で NSNotificationCenter を使用していますか? View Controller をオブザーバーとして NotificationCenter に追加すると、retainCount が増加する可能性があります。

于 2012-03-04T13:16:41.593 に答える