0

UITableviewcontroller (DOArticleListViewController) をロードするナビゲーション コントローラーがあります。

- (void) showList: (NSFetchedResultsController*) list title:(NSString*) title {
    DOArticleListViewController* listView = [[[self navigationController] storyboard] instantiateViewControllerWithIdentifier:@"DOArticleListViewController"];
    [listView setObjects:list];
    [listView setViewTitle:title];
    [[self navigationController] pushViewController:listView animated:YES];
}

DOArticleListViewController の [戻る] ボタンをタップすると、ビューが解放されず (dealloc/viewDidUnload がない)、前後に移動するたびにメモリ使用量が増加します。

何が原因ですか、または強制的にリリースするにはどうすればよいですか? 最近ARCに引っ越したばかりなので、「NSFetchedResultsController」と関係があるかもしれません。

TableViewController の宣言は次のとおりです。

@interface DOPrototypeListViewController : DOPrototypeViewController <NSFetchedResultsControllerDelegate, UITableViewDelegate> {

    IBOutlet UITableView * _tableView;

    int _cellHeight;

@protected
    NSFetchedResultsController* _objects;   
    NSString* _cellIdentifier;

    bool _commonId;
    int _sectionItemsSkipped;
}

@property (nonatomic, strong) UITableView *tableView;
@property (nonatomic, strong) NSFetchedResultsController* objects;

- (NSIndexPath*)calculateObjectIndexPath:(NSIndexPath*) indexPath;
- (NSIndexPath*)calculateTableIndexPath:(NSIndexPath*) indexPath;

@end

リストを強力として宣言しましたが、それを弱くしたかのように、後続のdetailViewControllerに移動するときにオブジェクトを探しているときにNSFetchedResultsControllerがアンロードされます。

編集: プロファイリングではオブジェクトがリリースされていないように見えるため、より根本的な問題があると思います。保持カウントが 0 の場合でも、オブジェクトはメモリに残っているように見えます。夏に ARC に引っ越し、自動変換を行いました。オブジェクトが保持され、解放/解放されない原因となる単純な根本的な欠陥がどこかにあるのではないかと思います。

クラス自体でインスタンス化されたオブジェクトは nil に設定されますか? たとえば、これをnilに設定する必要がありますか:

_mediaPlayerHelper = [[DOMediaPlayerHelper alloc] init:self];

ARCの前はそうしていたでしょうが、今ではビューコントローラーがビュースタックから削除されたときに呼び出される関数がありません(削除することはできますが、これはゴングが詳細ビュー コントローラー)。

4

1 に答える 1

0

プロパティと Lazy インスタンス化を作成できると思います

DOArticleListViewController* listView

-(DOArticleListViewController*)listView{
    if (!_listView){
        _list = [[[self navigationController] storyboard] instantiateViewControllerWithIdentifier:@"DOArticleListViewController"];
    }
    return _listView;
}

このようにして、VC を再利用できます。

編集:

戻るボタンについてのコメントに対して

// Set the left button for menu
UIImage *menuImage = [UIImage imageNamed:@"back_image"];

//create the button and assign the image
UIButton *menuButton = [UIButton buttonWithType:UIButtonTypeCustom];
[menuButton setImage:menuImage forState:UIControlStateNormal];

[menuButton addTarget:self action:@selector(backButtonEvent:) forControlEvents:UIControlEventTouchUpInside];

//create a UIBarButtonItem with the button as a custom view
UIBarButtonItem *menuBarItem = [[UIBarButtonItem alloc] initWithCustomView:menuButton];
self.navigationItem.leftBarButtonItem = menuBarItem;

次に backButtonEvent メソッドで、すべてのクリーン アクションを追加してから、現在の VC のポップを作成できます。

-(IBAction)backButtonPressed:(id)sender{
    //Clear here
    [self.navigationController popViewControllerAnimated:YES];
}
于 2013-11-14T19:33:22.380 に答える