UIViewController没有用ARC和导航控制器实现

时间:2013-11-14 19:26:07

标签: ios objective-c uiviewcontroller uinavigationcontroller automatic-ref-counting

我有一个导航控制器,它加载了一个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),并且每次我前进和后退时内存使用量都会增加。

可能是什么原因,或者我怎么强迫它释放? 我可能与“NSFetchedResultsController”有关,因为我最近刚搬到ARC。

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,并进行了自动转换。我只是想知道我是否有一个简单的基本缺陷导致对象被保留并且从未被释放/ dealloc。

在类本身中实例化的对象是否设置为nil? 例如我需要将其设置为nil:

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

在ARC之前我会这样做,但是现在我没有从视图堆栈中删除视图控制器时调用的函数(并且可以删除,但这只是在返回某个级别时,而不是在锣到细节视图控制器。)

1 个答案:

答案 0 :(得分: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];
}