0

我几乎完成了我的第一个应用程序(漫长但有趣的时光)

我正在尝试一周来减少应用程序的内存使用量,但如果这不起作用,我想确保它在使用后释放视图,但我发现这不会发生......

我对 searchviewController 没有内存问题,它更多的是使用 100 mb ram 的 DetailsViewController。

我将尝试在摘要中展示我的应用程序是如何构建的:

Searchview controller 

The main screen --> UIViewController with tableview 

in the didSelectRowAtIndex i have:

    DetailsViewController *controller = [[DetailViewsController alloc]initWithNibName:@"DetailsViewController" bundle:nil];

    SearchResult *searchResult = [searchResults objectAtIndex:indexPath.row];
    controller.searchResult = searchResult;


DetailsViewController

详细屏幕是在选择一行时调用的,它的Uiview具有一个子视图(自定义scrollView),自定义scrollview具有icarousel(custom uiview)

.h

@property (nonatomic,weak) SearchResult *searchResult;

.m

@property (nonatomic, retain) iCarousel *carousel;
@property (nonatomic, retain) UINavigationItem *navItem;

执行:

    MGBox *tablesGrid, *table1;

ViewDidLoad:

//Add barButton
UIBarButtonItem *reactButton = [[UIBarButtonItem alloc]..];
carousel = [[iCarousel alloc] init..];

//Add Tablesgrid
tablesGrid = [MGBox boxWithSize:tablesGridSize];
tablesGrid.contentLayoutMode = MGLayoutGridStyle;
[self.scrollview.boxes addObject:tablesGrid];

//Add Table
table1 = MGBox.box;
[tablesGrid.boxes addObject:table1];

在此之后,我具有将 searchResult 添加到标签并填充 icarousel(最多 6 个项目)的功能,icarousel 是一个 uiview,我将其作为子视图添加到 scrollview 等。

当我推回导航栏并返回主视图控制器时,它不会释放视图,为什么?(nslogged dealloc 但从未被调用)。内存警告后,它调用 ViewDidUnload 并释放一些内存,但仍然没有释放 ....

我没有参考其他对象,对吗?除了 searchResult 但我将它设置为弱所以它不应该是参考权?

一些信息:

在主视图上搜索后,我有:

实时字节:5,75 mb 实时:27.342 瞬态:68.200 总字节:25.30 mb

选择一行并进入 detailsViewController 后,我有:

实时字节:5.4 mb 实时:32.498 瞬态:76.488 总字节:29.55 MB

拖动icarousel的子视图行后(看图):

实时字节:5.5 mb 实时:32.798 瞬态:122.850 总字节:36.41 MB

在自定义表格视图中选择一些表格后

实时字节:5.7 mb 实时:33.508 瞬态:161.80 总字节:40.12 MB

在应用程序中打开链接并返回后(在模式视图中打开并再次关闭它)

实时字节:6.7 mb 实时:43.821 瞬态:371.761 总字节:144.95 MB

单击图片并全屏显示照片并再次返回 detailscreenview 后(打开模式并关闭)

实时字节:6.76 mb 实时:43.798 瞬态:400.850 总字节:155.69 MB

如果我回到另一排,它永远不会减少它只会增加

不要对我太苛刻或无缘无故地关闭话题..

给我一些提示或建议,或者如果您不知道“问题”是什么,请向我解释这些是什么:实时字节 - #living - #Transitory - 总体字节 - # 总体

我要感谢这个网站提供的所有信息,因为没有它我永远不会走到现在

4

1 回答 1

2

回答你的问题:

  1. 你在导航栏上说“当我向后推时”。我希望你的意思是你“突然”回来了。您推动进入辅助控制器/场景。你弹出回去。请参阅popViewControllerAnimated。同样,每次你presentViewController,你都应该有一个关联的dismissViewControllerAnimated.

  2. 如果使用情节提要,请确保情节提要中没有循环转场(例如,从 A 转至 B,从 B 转至 A)。有关此主题的简要讨论,请参阅iOS 5.1 中的 ARC 和情节提要未释放内存。

  3. 另一种可能性是“强参考周期”(又名“保留周期”)。请参阅高级内存管理编程指南。任何可能保持对控制器的强引用的东西都可能导致这个问题。不太明显的例子包括重复NSTimer对象之类的东西。


更新:

一些关于内存管理的总顾问

  • 如果您遇到内存问题,您应该始终通过静态分析器运行您的代码。如果您不使用 ARC,或者如果您使用任何 Core Foundation 调用,这一点尤其重要,但在遇到任何内存问题时,这通常是一个很好的第一步。

  • 有关如何使用 Instruments 在您的应用程序中查找泄漏的指导,参阅使用 Instruments 查找泄漏。

  • 有时,当您的内存分配出现峰值时,确定导致峰值的原因很有用。有关如何从您的分配到对这些分配的来源进行更有意义的分析的具体建议,请参阅此Stack Overflow 答案的第 4 点。简而言之,突出显示您在分配中无法解释的跳跃,设置底部窗口以显示调用树,隐藏系统库,并查看您的哪些例程正在消耗内存。

于 2013-01-10T15:33:22.567 回答