如何释放子视图控制器的内存

时间:2014-05-05 08:27:32

标签: ios objective-c memory-management instruments

我有一个页面视图控制器,其中我有四个视图控制器。我的问题是当我去第二个视图控制器我需要释放第一,第三和第四视图控制器的内存类似于其他三个视图控制器。如何找到无论是使用instrument为视图控制器分配还是释放内存。我尝试使用dealloc但是方法没有被调用,我使用的是arc.I我的代码如下

-(NewsViewController *)news

{

if (!news) {

UIStoryboard *storyboard = self.storyboard;
news = [storyboard instantiateViewControllerWithIdentifier:@"News"];
}

return news;

}

-(PriceViewController *)price 
{

  if (!price) {

    UIStoryboard *storyboard = self.storyboard;
    price = [storyboard instantiateViewControllerWithIdentifier:@"price"];

  }
return price;

}

- (CommentryViewController *)commentry {

if (!commentry) {
    UIStoryboard *storyboard = self.storyboard;
    commentry = [storyboard instantiateViewControllerWithIdentifier:@"commentry"];
}

return commentry;
}

-(WatchlistViewController *)watchlist {

if (!watchlist) {
    UIStoryboard *storyboard = self.storyboard;
    watchlist = [storyboard instantiateViewControllerWithIdentifier:@"watchlist"];
}

return watchlist;
}


- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController {

UIViewController *nextViewController = nil;

if (viewController == self.news) {
    nextViewController = self.commentry;


}
else if(viewController == self.commentry) {
            titleView.text = @"Commentry";
    [titleView sizeToFit];

    //self.title=@"Commentry";
    nextViewController = self.price;

}
else if(viewController == self.price) {

    titleView.text = @"Price";
    [titleView sizeToFit];
    nextViewController = self.watchlist;


}
else if(viewController == self.watchlist) {
    titleView.text = @"WatchList";
    [titleView sizeToFit];

}

return nextViewController;
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController {

UIViewController *prevViewController = nil;

if (viewController==self.watchlist) {
    titleView.text = @"WatchList";
    prevViewController = self.price;


}
else if (viewController == self.price) {
        titleView.text = @"Price";
    prevViewController = self.commentry;
       }
else if (viewController == self.commentry) {
    titleView.text = @"Commentry";
    prevViewController = self.news;


}
else if(viewController == self.news) {

    titleView.text = @"News";
}

return prevViewController;
}

1 个答案:

答案 0 :(得分:1)

UIPageViewController中,如果你调用-viewControllers,你应该看到所有的视图控制器都加载到内存中,如果这个数组中有一些你不应该强制释放它们,因为页面视图控制器管理内存很好地从该阵列中删除不需要的视图控制器。这意味着如果没有其他人对他们拥有所有权,那么将取消分配,您应该看到内存分配工具减少。
视图控制器有自己的方式来处理内存占用(规则总是与语言相同,但有一种内部机制有助于保持低内存)当处于内存压力时,这是因为视图控制器本身并没有占用太多内存,但是加载它们的资源确实如此 自iOS 6以来,VC中的内存管理行为发生了很大变化(我将只讨论这个问题),当系统需要内存时,不可见的VC标记其视图后备层为脏,准备发布,通常这释放了大量的内存,但是如果在你查看控制器中你创建并拥有许多对象的所有权,那么永远不会释放这个内存,除非你在方法-didReceiveMemoryWarning中执行,或者你摆脱了当你使用它们时它们。 你永远不应该调用dealloc,并且在ARC中也是禁止的,如果内存中有大量内存,你需要检查如何管理这些对象的内存。
我举一个明确的例子,让我们假设你在页面VC中加载其他带有全屏图像的VC,如果你使用+imageNamed加载它们,那些图像将在缓存中完成,即使你的VC被正确解除分配了图像占用仍然存在。