【发布时间】:2013-10-29 09:29:35
【问题描述】:
我在目标 C 中的内存管理方面遇到问题。我一直在阅读Advanced Memory Management Programming Guide,但我找不到解决问题的方法,可能是完全放弃 ARC 并手动管理内存。
问题来了:
我创建了一个Controller 类,其中包含有关在特定时间做什么的信息。
Controller 类告诉应用程序的其余部分播放视频(例如)。视频播放良好。视频播放完毕后,Controller 类知道下一步该做什么。
不幸的是,Controller 类几乎在视频开始播放时就被 ARC 释放和释放。所以当视频结束时,应用程序调用Controller 类来查看它接下来应该做什么,然后整个事情就崩溃了。我收到了EXC_BAD_ACCESS,因为该类已不在内存中。
我知道 ARC 正在发布我的 Controller 课程,因为在它告诉视频开始播放之后,它什么也没做。但我想保留那个类,直到我再次需要它为止。
我将这个类声明为一个属性,如下所示:
@property (strong, nonatomic) Controller * controller;
但尽管如此,ARC 会在它不做任何事情时继续释放该类。
编辑:
我已将此属性移至 App Delegate。但 ARC 仍在发布它。我不能把它变成一个单例,因为我需要拥有这个类的多个副本。
当我不想让 ARC 释放对象时,如何停止它??
是否可以在对象不做任何事情时将其保留在内存中?
这可能吗?还是我应该放弃 ARC 并手动进行内存管理?
【问题讨论】:
-
你在哪里定义 *controller 属性?
-
在 Master/Detail 视图应用的 detailViewController 中。
-
“我将这个类声明为一个属性,就像这样:......” - 我会问一些愚蠢的问题:你是否为这个属性赋值?哪个阶级拥有这个属性?
-
强引用将阻止 ARC 发布内容。如果这不能解决问题,那么您的崩溃很可能不是由于 ARC 发布的内容。
-
@Jimmery:您可以在 Controller 类中实现一个空的
dealloc方法(是,ARC 允许这样做!)并在那里设置一个断点。然后你会看到对象被释放的确切时间。这可能有助于找到您的问题。
标签: objective-c