Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.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 我如何清理我的记忆?_Ios_Iphone_Objective C_Memory - Fatal编程技术网

Ios 我如何清理我的记忆?

Ios 我如何清理我的记忆?,ios,iphone,objective-c,memory,Ios,Iphone,Objective C,Memory,我有一个图像处理应用程序,用于测试iOS上块/线程的潜在加速。该算法运行良好,使用了相当数量的内存,然后在运行后将其转储 我制作了一个测试套件,按顺序运行算法10次,使用并行实现运行算法10次。如果我试着在手机上运行它,它会因为内存压力而崩溃——最终需要432MB的内存。然而,一旦套件完成,所有的东西最终都会被清理干净:/ 每次运行都使用大约25MB的内存。因此,我认为解决方案是在每次运行后重置所有对象,然后将它们清理干净。我基本上有两个处理对象来完成我所有的工作。所以在每次运行之后,我认为将

我有一个图像处理应用程序,用于测试iOS上块/线程的潜在加速。该算法运行良好,使用了相当数量的内存,然后在运行后将其转储

我制作了一个测试套件,按顺序运行算法10次,使用并行实现运行算法10次。如果我试着在手机上运行它,它会因为内存压力而崩溃——最终需要432MB的内存。然而,一旦套件完成,所有的东西最终都会被清理干净:/

每次运行都使用大约25MB的内存。因此,我认为解决方案是在每次运行后重置所有对象,然后将它们清理干净。我基本上有两个处理对象来完成我所有的工作。所以在每次运行之后,我认为将它们设置为nil会导致它们被重新创建,旧版本被销毁,内存被释放。然而,这对我的记忆使用没有影响

我还需要做些什么来释放通话之间的内存吗?我认为Objective-C现在正在使用引用计数,一旦我消除了viewController中唯一的引用,它就会被释放。如有任何建议,将不胜感激

这是我尝试释放内存的测试套件算法:

- (void)runTestSuite
{
    // Sequential
    NSLog(@"Sequential Run: ");
    for (int i = 0; i < 10; i++) {
        self.imageView.image = self.startImage;
        self.imageManipulator = nil;
        self.objectRecognizer = nil;
        for (UIView *view in self.gameView.subviews) {
            [view removeFromSuperview];
        }
        [self processImageInParallel:NO];
    }
    [self printResults];
    [self clearResults];
    // Parallel
    NSLog(@"Parallel Run: ");
    for (int i = 0; i < 10; i++) {
        self.imageView.image = self.startImage;
        self.imageManipulator = nil;
        self.objectRecognizer = nil;
        for (UIView *view in self.gameView.subviews) {
            [view removeFromSuperview];
        }
        [self processImageInParallel:YES];
    }
    [self printResults];
    [self clearResults];
}
-(void)runTestSuite
{
//连续的
NSLog(@“顺序运行:”);
对于(int i=0;i<10;i++){
self.imageView.image=self.startImage;
self.imageManipulator=nil;
self.objectRecognizer=nil;
用于(在self.gameView.subview中的UIView*视图){
[视图从SuperView移除];
}
[自处理图像并行:否];
}
[自行打印结果];
[自我澄清结果];
//平行的
NSLog(@“并行运行:”);
对于(int i=0;i<10;i++){
self.imageView.image=self.startImage;
self.imageManipulator=nil;
self.objectRecognizer=nil;
用于(在self.gameView.subview中的UIView*视图){
[视图从SuperView移除];
}
[自处理图像并行:是];
}
[自行打印结果];
[自我澄清结果];
}

一些源代码会有所帮助。若并没有,一般建议是:将执行图像处理的代码包装在autoreleasepool中(请参阅)


这将尽快丢弃临时对象,减少内存峰值。

除了改进算法以提高内存使用率之外,您还可以尝试一下
@autoreleasepool
。这将释放在每个循环之间使用的可释放对象,而无需结束当前循环周期

for (int i = 0; i < 10; i++) {
    @autoreleasepool {
    }
}
for(int i=0;i<10;i++){
@自动释放池{
}
}
从:

在许多情况下,允许临时对象累积到 当前事件循环迭代的结束不会导致过度的 开销但是,在某些情况下,您可能会创建大量 大量增加内存占用的临时对象,以及 你想更快地处理掉的。在后一种情况下,您可以 可以创建自己的自动释放池块。在街区的尽头, 临时对象将被释放,这通常会导致 取消分配,从而减少程序的内存占用

应该在这里使用

许多程序创建自动删除的临时对象。这些 对象添加到程序的内存占用空间中,直到 块在许多情况下,允许临时对象累积 直到当前事件循环结束,迭代不会导致 管理费用过高;但是,在某些情况下,您可能会创建 大量临时对象,这些临时对象大大增加了内存 您希望更快速地处理的足迹。在这些 在后一种情况下,您可以创建自己的自动释放池块。在 块结束时,将释放临时对象,通常 结果导致它们的释放,从而减少程序的内存 足迹

-(void)runTestSuite
{
//连续的
NSLog(@“顺序运行:”);
对于(int i=0;i<10;i++){
@自动释放池
{
self.imageView.image=self.startImage;
self.imageManipulator=nil;
self.objectRecognizer=nil;
用于(在self.gameView.subview中的UIView*视图){
[视图从SuperView移除];
}
[自处理图像并行:否];
}
}
[自行打印结果];
[自我澄清结果];
//平行的
NSLog(@“并行运行:”);
对于(int i=0;i<10;i++){
@自动释放池
{
self.imageView.image=self.startImage;
self.imageManipulator=nil;
self.objectRecognizer=nil;
用于(在self.gameView.subview中的UIView*视图){
[视图从SuperView移除];
}
[自处理图像并行:是];
}
}
[自行打印结果];
[自我澄清结果];
}

您可以共享任何相关代码吗?@Merlevede我不确定它是否有用,但我已经在testSuite中编辑过。我可以理解内存问题,因为
imageManipulator
objectRecognizer
具有完整的图像像素数据数组。我希望删除引用可以清除它们。您可以将代码发布到
processImageInParallel:
方法吗?每个图像有多大?就是这样,谢谢!现在它的最大容量约为90MB,我可以管理和使用它。
- (void)runTestSuite
{
    // Sequential
    NSLog(@"Sequential Run: ");
    for (int i = 0; i < 10; i++) {
        @autoreleasepool
        {
            self.imageView.image = self.startImage;
            self.imageManipulator = nil;
            self.objectRecognizer = nil;
            for (UIView *view in self.gameView.subviews) {
                [view removeFromSuperview];
            }
            [self processImageInParallel:NO];
        }
    }
    [self printResults];
    [self clearResults];
    // Parallel
    NSLog(@"Parallel Run: ");
    for (int i = 0; i < 10; i++) {
        @autoreleasepool
        {
            self.imageView.image = self.startImage;
            self.imageManipulator = nil;
            self.objectRecognizer = nil;
            for (UIView *view in self.gameView.subviews) {
                [view removeFromSuperview];
            }
            [self processImageInParallel:YES];
        }
    }
    [self printResults];
    [self clearResults];
}