Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何释放子视图控制器的内存_Ios_Objective C_Memory Management_Instruments - Fatal编程技术网

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

Ios 如何释放子视图控制器的内存,ios,objective-c,memory-management,instruments,Ios,Objective C,Memory Management,Instruments,我有一个页面视图控制器,其中有四个视图控制器。我的问题是,当我转到第二个视图控制器时,我需要释放第一个视图控制器的内存,第三视图控制器和第四视图控制器与其他三视图控制器类似。如何找到它是否正在使用仪器为视图控制器分配或释放内存。我尝试使用dealloc,但没有调用该方法,我正在使用arc。我的代码如下 -(NewsViewController *)news { if (!news) { UIStoryboard *storyboard = self.storyboard; news = [

我有一个页面视图控制器,其中有四个视图控制器。我的问题是,当我转到第二个视图控制器时,我需要释放第一个视图控制器的内存,第三视图控制器和第四视图控制器与其他三视图控制器类似。如何找到它是否正在使用仪器为视图控制器分配或释放内存。我尝试使用dealloc,但没有调用该方法,我正在使用arc。我的代码如下

-(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;
}

UIPageViewController
中,如果调用
-viewControllers
,应该会看到内存中加载的所有视图控制器,如果此数组中填充了一些视图控制器,则不应强制解除对它们的锁定,因为页面视图控制器可以很好地管理内存,从该数组中删除不需要的视图控制器。这意味着,如果没有其他人拥有它们的所有权,则将解除对它们的分配,您应该会看到内存分配工具的减少。
视图控制器有自己的方法来处理它们的内存占用(规则总是与语言相同,但有一种内部机制可以帮助保持内存较低,这是因为视图控制器本身不占用太多内存,但加载的资源却占用了。
自iOS 6以来(我只想说这一点),VC中的内存管理行为发生了很大变化,当系统需要内存时,不可见的VC会将其视图的备份层标记为脏的,准备释放,通常这会释放大量内存,但如果在view controller中创建并拥有许多对象,此内存永远无法释放,除非您使用方法
-didReceiveMemoryWarning
,或者在使用完后将其清除。 您永远不应该调用dealloc,而且在ARC中也被禁止,如果您的内存增长过大,您需要检查如何管理这些对象的内存。

我举了一个例子来说明问题,假设在你的VC页面中,你加载了其他带有全屏图像的VC,如果你使用
+imageNamed
加载它们,这些图像将在缓存中完成,即使你的VC被正确释放,图像占用也将保留。

你启用了ARC吗?@Mepla:你读过问题了吗?他已经成功了。ON-T:关于如何使用仪器,网上有很好的指南。谷歌,你会发现。我打赌你有一些变量保留“self”,因此你的dealloc永远不会被调用。这还取决于您使用的导航控制器,因为当您从VC队列中弹出它们时,其中一些只调用“dealloc”。我已经发布了一些页面控制器的代码。我已经阅读了这些教程,但无法理解。因此我不需要在本senario中执行任何特殊的dealloc。是真的吗?“视图控制器有自己的释放内存的方法“不完全正确,但我不知道如何解释,如果它们的保留计数变为0,它们将完全释放并释放内存,但它们也自己管理对象的内存。如果您在导航控制器加载的视图控制器堆栈中,导航控制器内存压力情况将要求不可见视图控制器通过向其传递内存警告来释放一些内存。了解了?这些规则当然与语言相同,但在VCs中也有一种内部机制,有助于保持较低的内存级别。@Yashwant777如果你做得很好,除了你自己加载的资源外,你不需要考虑这些。规则总是一样的:惰性地实例化资源,并在不需要时通过不再引用它们(ARC将处理它们)将其丢弃。当我看到使用HeapShot的内存分配时,我发现当我转到相应的控制器时,内存分配会增加,当我返回时,内存分配会减少。当它不断维护时,内存分配会变为0。这表明它工作正常。