Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.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_Objective C - Fatal编程技术网

Ios 关于内存警告的问题

Ios 关于内存警告的问题,ios,objective-c,Ios,Objective C,我的iOS应用程序内存有问题,对此我有几个问题 首先,我使用的是iOS 6,我使用的是ARC 现在让我解释一下我的情况: 我有两种观点。在第一个视图中,如果我点击一个按钮,我将使用alloc和init创建第二个视图,并使用以下代码将其显示为模式: [self presentViewController:secondView animated:YES completion:^{ [secondView prepareToDraw]; // Function I use to s

我的iOS应用程序内存有问题,对此我有几个问题

首先,我使用的是iOS 6,我使用的是ARC

现在让我解释一下我的情况:

我有两种观点。在第一个视图中,如果我点击一个按钮,我将使用alloc和init创建第二个视图,并使用以下代码将其显示为模式:

[self presentViewController:secondView animated:YES completion:^{
        [secondView prepareToDraw];   // Function I use to start my computations and rendering
}];
在某些时候,当计算完成后,我想关闭第二个视图并返回第一个视图。我正在从第二个角度使用此代码:

[self dismissViewControllerAnimated:YES completion:^{
            [self finished];  // Function I use to free some malloc
}];
我在运行我的应用程序时,没有泄漏

以下是我的didReceiveMemoryWarning的代码:

tearDownGL函数释放了OpenGLES资源,如纹理、顶点数组等

当我运行应用程序时,在第一个和第二个视图之间进行多次切换后,我收到内存警告,然后我的应用程序崩溃

以下是我的问题:

1-应用程序是否自动释放我的UIImage、UIView、。。。我的控制器?如果没有,如何在使用ARC时释放它们? 我还看到了viewDidUnload函数,但正如文档所述,它已被弃用:

从内存中释放控制器的视图时调用。不赞成 在iOS 6.0中。在内存不足和 所以这个方法永远不会被调用

但是,如果在内存不足的情况下不再清除视图,如何释放更多内存以防止应用程序崩溃? 我该怎么办

2-我在我的2个控制器的didReceiveMemoryWarning函数上设置了一个断点。当我在模拟器上运行应用程序时,我模拟内存警告。 我可以看到didReceiveMemoryWarning为我的2个控制器调用了一次。 但是,如果我在第一个和第二个控制器之间切换多次,didReceiveMemoryWarning将为第一个视图控制器调用一次,但为第二个视图控制器调用几次。如果我切换3次,该函数将被调用3次。所以我猜,当我关闭第二个视图返回第一个视图时,第二个视图没有被释放,仍然存在。为什么?我怎么能强迫它被摧毁?因为我将不再使用它,并创建一个新的
我在一个函数中创建了第二个视图控制器,并且我没有保留对它的任何引用,因为它不存储在类中。

ARC并不总是意味着图像、视图等会立即发布。它被添加到最近的arc池中并被释放。如果应用程序可能需要它或在某个地方使用它,它会被添加到主池中,主池只有在应用程序终止时才会被释放。因此,如果您认为该对象达到了预期目的,那么最好自己移除该对象。尤其是在图像的情况下,它会保留在内存中,因为它不知道是否在其他地方使用它。

ARC并不总是意味着图像、视图等会立即被释放。它被添加到最近的arc池中并被释放。如果应用程序可能需要它或在某个地方使用它,它会被添加到主池中,主池只有在应用程序终止时才会被释放。因此,如果您认为该对象达到了预期目的,那么最好自己移除该对象。尤其是在图像的情况下,它会保留在内存中,因为它不知道是否在其他任何地方使用它。

您应该在ARC中释放,这意味着将所有强引用设置为零所有内存图像、NSData对象、数组、,由模型层等表示的当前不需要的所有数据,在再次使用时可以轻松地重新创建这些数据。如果这些对象可能在内存警告期间被释放,然后将被重新创建,那么所有其他代码的编写方式都应确保属性/ivar被检查为nil

我怀疑“自我观点”是可能被处置的对象之一

您可能已显示UIImageView。可能是用UIImage对象创建的。在显示UIImageView时,内存中并不真正需要该UIImage。如果UIImageView仍然需要它,那么它会保留它或在其onw上保留一个强引用,这样您就不必担心保留图像本身。这就是要释放的资源


如果self.context是处置资源之一,我不能说。很可能是这样

您应该在ARC中释放,这意味着将所有强引用设置为零所有内存映像、NSData对象、数组、模型层表示的所有数据等当前不需要的,并且在再次使用时可以轻松地重新创建。如果这些对象可能在内存警告期间被释放,然后将被重新创建,那么所有其他代码的编写方式都应确保属性/ivar被检查为nil

我怀疑“自我观点”是可能被处置的对象之一

您可能已显示UIImageView。可能是用UIImage对象创建的。在运行UIImageView时,内存中并不真正需要该UIImage 显示。如果UIImageView仍然需要它,那么它会保留它或在其onw上保留一个强引用,这样您就不必担心保留图像本身。这就是要释放的资源


如果self.context是处置资源之一,我不能说。很可能是这样

无论何时处理块,都应该使用对self的弱引用,因为这可能导致保留循环。因此,请将代码更改为:

__weak typeof(self) blockSelf = self;
[self dismissViewControllerAnimated:YES completion:^{
    [blockSelf finished];  // Function I use to free some malloc
}];
此外,释放任何内容的代码都应该在dealloc中。如果它只发生在该控制器的生命周期结束时,则不需要自定义方法

你的第一个电话似乎也错了:

[self presentViewController:secondView animated:YES completion:^{
        [secondView prepareToDraw];   // Function I use to start my computations and rendering
}];
如果prepareToDraw只发生一次,即第一次显示控制器时,则应在viewDidLoad中运行此代码。这也将有利于您的体系结构,因为只有控制器本身应该知道它在开始时必须设置什么,在结束时必须拆卸什么


希望有帮助。可能代码中还有其他/更多问题。

无论何时处理块,都应该使用对self的弱引用,因为这可能导致保留循环。因此,请将代码更改为:

__weak typeof(self) blockSelf = self;
[self dismissViewControllerAnimated:YES completion:^{
    [blockSelf finished];  // Function I use to free some malloc
}];
此外,释放任何内容的代码都应该在dealloc中。如果它只发生在该控制器的生命周期结束时,则不需要自定义方法

你的第一个电话似乎也错了:

[self presentViewController:secondView animated:YES completion:^{
        [secondView prepareToDraw];   // Function I use to start my computations and rendering
}];
如果prepareToDraw只发生一次,即第一次显示控制器时,则应在viewDidLoad中运行此代码。这也将有利于您的体系结构,因为只有控制器本身应该知道它在开始时必须设置什么,在结束时必须拆卸什么


希望有帮助。您的代码中可能还有其他/更多问题。

请查看自动释放池:

内容如下:

使用本地自动释放池块减少峰值内存占用

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


我有一个类似的问题,我将所有我想要摆脱的大对象封装在@autoreleasepool块中。

请查看自动释放池:

内容如下:

使用本地自动释放池块减少峰值内存占用

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


我有一个类似的问题,我把所有我想去掉的大对象封装在一个@autoreleasepool块中。

将变量设置为nil对我有用。但奇怪的是,为什么不直接在块的末尾释放变量呢?使用ARC,当没有强引用时,它会被释放。可能还剩下很弱的引用。弱引用应该自动为零,但不要依赖于此。如果没有ARC,则只有当内存已自动释放并且没有其他未自动释放的内存保留在内存上时,才会在块结束时或多或少地释放内存。将变量设置为nil对我有效。但奇怪的是,为什么不直接在块的末尾释放变量呢?使用ARC,当没有强引用时,它会被释放。可能还剩下很弱的引用。弱引用应该自动为零,但不要依赖于此。在没有ARC的情况下,只有当内存已自动释放并且没有其他未自动释放的内存保留在内存上时,才会在块结束时或多或少地释放内存。autoreleasepool似乎可以工作。你的回答也解决了我的问题。然而,赫尔曼·克莱克是第一个这样接受他的回答的人。他的回答似乎有效。你的回答也解决了我的问题。然而,赫尔曼·克莱克是第一个接受他的回答的人,我改变了我的密码。这似乎是可行的,但是,赫尔曼·克莱克是第一个回答的人,他的回答也解决了我的问题,所以我接受了他的回答,我修改了代码。是的 然而,赫尔曼·克莱克是第一个回答的人,他的回答也解决了我的问题,所以我接受了他的回答