4

セルが選択されると、ビュー コントローラーがナビゲーション スタックにプッシュされるテーブル ビューがあります。

SAPostTableViewController *postViewController = [[SAPostTableViewController alloc] initWithNibName:NSStringFromClass([SAPostTableViewController class]) bundle:nil];
postViewController.site = site;
[self.navigationController pushViewController:postViewController animated:YES];
[postViewController release];

SAPostTableViewController には静的な tableView があり、そのセルは nib からロードされます。

メソッドをオーバーライドしましたinitWithNibName:bundle:

-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
        self.sections = [NSMutableDictionary dictionary];
    }
    return self;
}

sections保有物件です。

私はこれviewDidLoadSAPostTableViewController持っています:

- (void)viewDidLoad
{
    [super viewDidLoad];
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(cellVisibiltyChanged:) name:@"SAStaticCellVisibiltyChanged" object:nil];
}

で一致するようにviewDidUnload

- (void)viewDidUnload
{
    [super viewDidUnload];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"SAStaticCellVisibiltyChanged" object:nil];
}

ただし、ナビゲーション バーの [戻る] ボタンを押して (すべて標準の動作で、オーバーライドなし)、ポップしても、 orSAPostTableViewControllerは呼び出されません。つまり、プッシュするセルを再選択すると、新しいインスタンスが作成され、これを前後に繰り返すことは、ポップされたs が割り当て解除されないため、メモリ使用量が増加し続けることを意味します。(これは、割り当て時に Instruments を実行することでわかります)viewDidUnloaddeallocSAPostTableViewControllerSAPostTableViewControllerSAPostTableViewController

奇妙なことに、SAPostTableViewController を 2 回リリースすると、期待どおりに動作します。

SAPostTableViewController *postViewController = [[SAPostTableViewController alloc] initWithNibName:NSStringFromClass([SAPostTableViewController class]) bundle:nil];
postViewController.site = site;
[self.navigationController pushViewController:postViewController animated:YES];
[postViewController release];
[postViewController release];

(3 つ目のリリース ステートメントを追加すると、2 つだけで期待どおりにクラッシュします)

すぐ上のコードの最初の行で実行されるコードの行を使用retainCountしてステップスルーしましたが、retainCount は 1 のままです。余分な時間を保持されていますか?

SAPostTableViewController はこの場所でのみ使用されます。これは何のデリゲートでもなく、デリゲートもありません。

どうすれば修正を見つけることができますか、それとも私が見逃した単純なものですか?

以下は、SAPPostTableViewController を 1 回だけ (リリース文を 1 つだけ) プッシュした後の Instruments の表示です。 ここに画像の説明を入力

そして、前後に繰り返しナビゲートした後に表示されるもの (ここでも、1 つのリリース ステートメント): ここに画像の説明を入力

4

2 に答える 2

0

あなたの問題が何であるかはわかりませんが、考慮すべき点がいくつかあります。

  1. View Controller を 2 回解放しないでください。実際に UIKit でメモリ リークを発見した場合 (可能性は低い)、UIKit の将来のバージョンで修正される可能性があります。つまり、古いバージョンのアプリを新しいバージョンのオペレーティング システムで実行している場合は、(ビュー コントローラーを過剰にリリースしたために) クラッシュするだけです。クラッシュするよりもリークする方が良いです。リークの多いアプリは、まだ使用可能なアプリです (少なくとも、リークが多すぎるまでは)。ただし、クラッシュするアプリはまったく実行できません。

  2. -viewDidUnloadあなたがやるべきだと思っていることをしていません。これは、View Controller のビューがメモリ不足のためにアンロードされたときにのみ呼び出されます。通常の割り当て解除時には呼び出されません。代わりに-viewWillAppear:andに頼る方が賢明でしょう。-viewDidDisappear:

于 2012-05-19T15:14:36.687 に答える
0

SAPostTableViewController1 つのセルをクリックすると新しいオブジェクトが作成されます。init メソッドでオブジェクト () を作成せず、セルでクリックした同じオブジェクトの視聴時間をプッシュしないのはなぜですか

次のようなことができます:

postViewController = [[SAPostTableViewController alloc] initWithNibName:NSStringFromClass([SAPostTableViewController class]) bundle:nil];

そして

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
postViewController.site = site; 
[self.navigationController pushViewController:postViewController animated:YES]; [postViewController release]; 

    } 
于 2012-05-19T11:25:44.927 に答える