【问题标题】:Stop ARC releasing an object while it is idle停止 ARC 在空闲时释放对象
【发布时间】: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


【解决方案1】:

使用单例模式,以便Controller 照顾自己的生命周期并存在于应用程序范围内。这个共享实例从第一次被请求时就一直存在,直到应用终止,ARC不会随意释放它。

控制器.h:

@interface Controller : NSObject

+ (Controller *)sharedInstance;

@end

Controller.m:

#import "Controller.h"

static Controller *_instance = nil;
static dispatch_once_t _onceToken = 0;

@implementation Controller

+ (Controller *)sharedInstance {
    dispatch_once(&_onceToken, ^{
        _instance = [[Controller alloc] init];
    });
    return _instance;
}

// You could add this if you want to explicitly destroy the instance:
+ (void)destroy {
    _instance = nil;
    _onceToken = 0;
}

【讨论】:

    【解决方案2】:

    当 detailViewController 被解除分配时,您的控制器正在被解除分配。因此,您必须移动控制器的手柄并在其中定义以下任何内容:

    1. MasterViewController 或您的应用程序的 RootViewController 或
    2. 应用委托 或
    3. 创建一个由“trojanfoe”回答的单例

    【讨论】:

      【解决方案3】:

      在与UITableViews 合作时,我多次偶然发现这个案例。我创建了一个私有 @property (strong) id *yourObjectRetain 并将我的对象分配给它。多个对象的数组也可以工作。

      【讨论】:

      • 我需要的不止这些。 ARC 正在释放我的对象,即使它们很强大。
      • 只要至少有一个引用就不应释放它们。这就是我将它们放入此实例变量的原因。只是为了保留一个参考。
      • 我一直丢失的对象是另一个对象的属性,该对象是我的 AppDelegate 中的属性。父对象仍然存在并且在那里 - 所以有一个对我正在丢失的对象的引用。有没有办法强制 ARC 停止释放我的对象?
      • 你有没有看过这个:developer.apple.com/library/mac/documentation/Cocoa/Conceptual/…?仔细看看“单身人士”。他们可能会帮助您解决这个问题...
      猜你喜欢
      • 2012-05-04
      • 2019-06-22
      • 2023-03-19
      • 2012-10-01
      • 1970-01-01
      • 2013-11-29
      • 1970-01-01
      • 2013-09-07
      • 2012-01-13
      相关资源
      最近更新 更多