ARC 和dismissModalViewControllerAnimated:视图控制器内存未释放

Posted

技术标签:

【中文标题】ARC 和dismissModalViewControllerAnimated:视图控制器内存未释放【英文标题】:ARC and dismissModalViewControllerAnimated : viewcontroller memory is NOT released 【发布时间】:2012-09-29 16:41:32 【问题描述】:

如何使用 ARC 有效地释放模态视图控制器的内存?

我看到了一些关于这个主题的主题,但实际上我没有找到任何答案来解决处理模态视图控制器时看似常见的问题。

我制作了一个示例应用程序,其中 viewcontroller1 以模态方式呈现 viewcontroller2。 当我关闭 viewcontroller2(从 viewcontroller1)时,内存没有释放! :((见下面的内存日志)

奇怪:viewcontroller1中没有对viewcontroller2的强引用,确实调用了viewcontroller2的dealloc……

使用 presentModalViewController/dismissModalViewControllerAnimated 呈现/关闭视图控制器

查看我的内存使用情况:

ViewController1 显示:7.41 Mb 使用情况 --ACTION : 显示 ViewController2-- ViewController2 显示:8.11 Mb 使用情况 --ACTION : 关闭 ViewController2-- ViewController1 显示:8.06 Mb 使用情况 --ACTION : 显示 ViewController2-- ViewController2 显示:8.11 Mb 使用情况 --ACTION : 关闭 ViewController2-- ViewController1 显示:8.06 Mb 使用情况 --ACTION : 显示 ViewController2-- ViewController2 显示:8.11 Mb 使用情况 --ACTION :关闭 ViewController2-- ViewController1 显示:8.06 Mb 使用情况

谢谢

【问题讨论】:

你是如何计算内存使用量的? 我用这个:struct task_basic_info info; mach_msg_type_number_t size = sizeof(info); kern_return_t kerr = task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)&info, &size); double sizeInMegaBytes = (double)info.resident_size / 1000000; 与 Instruments -> Activity Monitor -> Real Memory Usage 中的值相同 【参考方案1】:

viewcontroller2 中的 dealloc 通常会释放该类中分​​配的变量和资源,而不是视图控制器本身。此外,当您使用 ARC 时,内存会自动处理,并且可能不会在您想要的时候释放。如果您不使用 ARC,则您可以完全控制内存管理,即使在今天,我们大多数人也会这样做。别担心它会自动释放你的对象。否则你可以搜索类似 java 中使用的 finalizer() 方法来发送你的对象进行垃圾收集(虽然 ARC 是 diff 然后是垃圾收集)。

【讨论】:

感谢您的回答。我试图在 viewcontroller2 中放置一个带有 png 图像的 UIImageView。 dealloc 不会释放 UIImage 内存。并且 30 分钟后 ARC 仍然没有释放它,即使我在显示 viewcontroller1 的情况下保持空闲状态。真的可以用 ARC 完全确定视图控制器吗?我想我现在确实会关闭 ARC @Apple_ios0304,您的回答具有误导性。使用 ARC 和不使用 ARC 一样,您可以控制对象的生命周期。如果有的话,您有更多 控制权,因为您可以轻松预测反向引用和本地分配对象的行为。 viewController 的强类型属性将被保留,直到它的引用者(viewController)被释放。这并不像很多人想象的那样经常发生。

以上是关于ARC 和dismissModalViewControllerAnimated:视图控制器内存未释放的主要内容,如果未能解决你的问题,请参考以下文章

ARC 和自动释放

[iOS]ARC和MRC下混编

目标 C 和 ARC

arc音频回传功能需要投影支持吗

MRC和ARC混编

earc和arc区别是啥?