我差不多完成了我的第一个应用程序(漫长而有趣的时间)
我正在尝试一周减少我的应用程序的内存使用量,但如果这不起作用,我想确保它被使用后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
我要感谢这个网站提供的所有信息,因为没有它,我将永远不会到目前为止
答案 0 :(得分:2)
回答你的问题:
你在导航栏上说“当我向后推”。我希望你的意思是你“弹回”了。你推动去辅助控制器/场景。你会回来。见popViewControllerAnimated。同样,每次presentViewController
,您都应该有关联的dismissViewControllerAnimated
。
如果使用故事板,请确保故事板中没有圆形分段(例如,从A到B的segue和从B到A的另一个)。有关此主题的简要讨论,请参阅memory not releasing with ARC and storyboard in iOS 5.1。
另一种可能性是“强参考周期”(a.k.a。“保留周期”)。请参阅Advanced Memory Management Programming Guide。任何可能保持对控制器的强引用的东西都可能导致此问题。不太明显的例子包括重复NSTimer
个对象。
<强>更新强>
关于内存管理的一些总法律顾问
如果您遇到内存问题,则应始终通过static analyzer运行代码。如果您不使用ARC,或者使用任何Core Foundation调用,这一点尤为重要,但在遇到任何内存问题时,这通常是很好的第一步。
有关如何使用Instruments查找应用内泄漏的指导,请参阅Finding leaks with Instruments。
有时候,当内存分配出现峰值时,确定导致峰值的原因很有用。有关如何从您的分配,到对这些分配的来源进行更有意义的分析的具体建议,请参阅此Stack Overflow answer的第4点。简而言之,在分配中突出显示一个无法解释的跳转,设置底部窗口以显示调用树,隐藏系统库,并查看内存消耗的例程。