Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.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 ViewController内存管理(以编程方式或使用ib)_Ios_Objective C_Memory Management_Viewcontroller - Fatal编程技术网

Ios ViewController内存管理(以编程方式或使用ib)

Ios ViewController内存管理(以编程方式或使用ib),ios,objective-c,memory-management,viewcontroller,Ios,Objective C,Memory Management,Viewcontroller,我用仪器监测我的应用程序的sARC内存使用情况,发现 当我从导航视图控制器堆栈中弹出视图控制器时,它的dealloc方法被调用。 但内存使用率只下降了一点点……比如0.6M,而且仍然比以前高得多 这就是问题所在。我的应用程序的内存使用量不断增加 如何将内存成本降低到视图控制器分配之前的值。 或者至少我怎样才能释放更多的内存 此外,使用脚本时,内存成本似乎要高得多 我应该像dealloc方法中的someArr=nil那样将数据设置为nil吗? 我不知道。谁来帮忙!谢谢 您可以尝试使用@autore

我用仪器监测我的应用程序的sARC内存使用情况,发现 当我从导航视图控制器堆栈中弹出视图控制器时,它的dealloc方法被调用。 但内存使用率只下降了一点点……比如0.6M,而且仍然比以前高得多

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

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

此外,使用脚本时,内存成本似乎要高得多

我应该像dealloc方法中的someArr=nil那样将数据设置为nil吗? 我不知道。谁来帮忙!谢谢

您可以尝试使用@autoreleasepool{}块,不过请注意,内存占用不一定会一直返回到它的起始位置。一个大的警告是,如果已经调用了dealloc,那么在代码中使用autoreleasepool可能不会起任何作用,因为VC已经正确发布了

尽管您可以考虑在视图控制器实现中使用它,也可以考虑在VC的DeLoC实现中使用。为了确保在调用VC的dealloc时,@autoreleasepool块中接收自动释放的对象将立即被释放

我的OSX代码片段:

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

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

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

        _treeSubViews = nil;
        _categoryView = nil;
    }
}
。。。这是为了减少像您一样的占地面积,通过强制拆除视图层次结构而编写的


而且

在视图控制器中,如果您使用[UIImage imagename:@xxx.png]方法加载图像,可能会有一些资源被系统缓存,比如UIImage。@KudoCC是的,我知道。我通常使用[UIImage imageWithContentsOfFile:]来表示大图像,而[UIImage imageNamed:]则表示按钮背景图像等小图像。我是否需要将数据源指向nil,如someArr=nil,我尝试过,但没有意义….内存使用率仍然很高…不,您不需要将它们设置为nil。如果您使用的是xib,在释放vc后可能会占用一些内存,系统可能会缓存它,以便您使用xib创建一个新的vc,这将比从文件加载更快。@KudoCC下一次在导航控制器中推送vc时,内存会再增加7M。似乎所有那些被称为dealloc方法的vcsalready仍然在内存中。。。如果我使用一个全局vc,每次将同一个控制器推入导航ctl,内存似乎只会增长一点点。真奇怪…真奇怪。如果您在一个复杂的项目中,您可以尝试编写一个演示来模拟上下文并分析演示。如果它再次出现,你可以上传它,我们可以一起看一看。我想我可以理解,但它不起作用…到目前为止,我可以看到,如果我使用全局变量,内存只会增长一点,或者每次我将vc推入导航控制器时,内存都会增长,如果调用dealloc,则VC没有保留任何内容,其内存可以释放,但可能不会立即释放。VC不在内存中,但其页面仍由应用程序拥有。上面在Dealoc中的自动释放块中设置零属性的想法是试图强制应用程序立即放弃内存。另外,请确保:提示:僵尸模板会导致内存增长,因为为了能够提供任何僵尸的信息,对象的内存分配永远不会真正释放。因此,对于iOS应用程序,将其与iOS模拟器一起使用,而不是在设备本身上使用。出于同样的原因,不要将Zombies模板与泄漏工具同时使用。