减少我的应用程序的内存

时间:2013-01-10 15:07:32

标签: ios xcode memory-management uitabbarcontroller

我差不多完成了我的第一个应用程序(漫长而有趣的时间)

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

我没有searchviewController的内存问题,更多的是使用100 mb内存的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(自定义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是我作为子视图添加到scrollview等的uiview。

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

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

一些信息:

搜索主视图后,我有:

活字节:5,75 mb生活:27.342 Transistory:68.200总体而言    字节:25.30 mb

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

实时字节:5.4 mb 生活:32.498 Transistory:76.488 总字节数:29.55 MB

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

实时字节:5.5 mb 生活:32.798 Transistory:122.850 总字节数:36.41 MB

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

实时字节:5.7 mb 生活:33.508 Transistory:161.80 总字节数:40.12 MB

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

实时字节:6.7 mb 生活:43.821 Transistory:371.761 总字节数:144.95 MB

点击图片并全屏制作照片并再次返回详细信息屏幕视图(打开模式并关闭)

实时字节:6.76 mb 生活:43.798 Transistory:400.850 总字节数:155.69 MB

如果我回到另一行它永远不会少,只需添加

不要对我不好或者无缘无故地关闭这个话题。

给我一​​些提示或建议,或者如果您不知道“问题”是什么,请解释一下这些是什么: 直播字节 - #living - #Transitory - 整体字节数 - #Overall

我要感谢这个网站提供的所有信息,因为没有它,我将永远不会到目前为止

1 个答案:

答案 0 :(得分:2)

回答你的问题:

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

  2. 如果使用故事板,请确保故事板中没有圆形分段(例如,从A到B的segue和从B到A的另一个)。有关此主题的简要讨论,请参阅memory not releasing with ARC and storyboard in iOS 5.1

  3. 另一种可能性是“强参考周期”(a.k.a。“保留周期”)。请参阅Advanced Memory Management Programming Guide。任何可能保持对控制器的强引用的东西都可能导致此问题。不太明显的例子包括重复NSTimer个对象。


  4. <强>更新

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

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

    • 有关如何使用Instruments查找应用内泄漏的指导,请参阅Finding leaks with Instruments

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