2014-09-05 38 views
1

我使用仪器来监视我的应用程序的(ARC)内存使用情况,并发现,当我从导航视图控制器堆栈弹出一个视图控制器时,它的dealloc方法被调用。 但是内存使用量只有一点点...(比如0.6M),并且比以前还要高。ViewController内存管理(以编程方式或使用ib)

所以这里是问题所在。我的应用程序的内存使用量不断增加....

如何将内存成本降低到视图控制器分配之前的值。 或者至少我怎么能释放更多的记忆。

此外,使用xib(storyboard)时,内存成本似乎更高。

我应该在dealloc方法中将数据设置为无像someArr = nil? 我不知道。任何人都请帮忙!谢谢!!

This image is captured when one view controller is allocated, and still alive after its dealloc method is called.......

+0

在视图控制器,可以存在一些资源如果加载使用该方法的图像'[UIImage的imageNamed:@由系统等'UIImage'缓存“xxx.png]”'。 – KudoCC 2014-09-05 09:13:45

+0

@KudoCC是的,我知道了。我通常对大图像使用[UIImage imageWithContentsOfFile:],对于像按钮背景图像这样的小图像,我使用[UIImage imageNamed:]。我是否需要将数据源指向零,如someArr = nil,我尝试过,但没有意义.....内存使用率保持高... – Cilitie 2014-09-05 09:25:44

+0

不,你不需要将它们设置为零。如果你正在使用xib,也许在vc被释放后需要一些内存,系统可能会缓存它,以便我用xib创建一个新的vc,它将比从文件中加载vc更快。 – KudoCC 2014-09-05 09:30:31

回答

0

您可以尝试使用@autoreleasepool{ }块,但要注意的是,内存占用不一定返回一路在那里开始。需要注意的是,如果已经调用了dealloc,那么在代码中使用autoreleasepool可能不会执行任何操作,因为VC已经正确释放。

虽然你可以考虑在哪里使用它视图控制器的实现,也许在一个dealloc执行为VC。为了确保在调用VC的dealloc时,在@autoreleasepool块中接收autorelease的对象将立即释放。我的

片段从OSX代码:

- (void) dealloc 
{ 
    @autoreleasepool { 
     // End KVO 
     [self stopObservingIndexPath]; 

     for (NSView* subView in _treeSubViews) 
      [subView removeFromSuperview]; 

     [_categoryView removeFromSuperview]; 
     [self.view removeFromSuperview]; 

     _treeSubViews = nil; 
     _categoryView = nil; 
    } 
} 

...这是写在寻求通过强制拆除视图层次结构,以减少占用空间像你。

而且the Apple reference here.

+0

我想我可以理解,但它不起作用......到目前为止,我可以看到,如果我使用全局变量var,内存只会增长一点,或者每次我将vc导入导航控制器时内存都会增长,并在应用程序从后台变为活动状态后下降到原始点。 – Cilitie 2014-09-09 06:54:58

+0

如果调用dealloc,没有任何东西保留了VC,并且它的内存*可以放开,但可能不会立即。 VC不在内存中,但它的页面仍属于应用程序。上面的想法是在dealloc中的autorelease块中删除属性,试图强制应用立即放弃内存。 – stevesliva 2014-09-09 18:16:42

+0

另外请确保你[不使用僵尸](https://developer.apple.com/library/ios/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/MemoryManagementforYouriOSApp/MemoryManagementforYouriOSApp.html):“提示:僵尸模板导致记忆因为为了能够提供关于任何僵尸的信息,对象的内存分配永远不会真正释放,因此对于iOS应用程序,可以在iOS Simulator中使用它,而不是在设备本身上使用它。出于同样的原因,不要使用僵尸与泄漏仪器同时使用的模板“。 – stevesliva 2014-09-09 18:17:13

相关问题