停止ARC在空闲时释放对象

时间:2013-10-29 09:29:36

标签: objective-c

我在目标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仍在发布它。我不能把它变成一个Singleton,因为我需要有这个类的多个副本。

当我不想要它时,如何停止ARC释放对象?

是否可以在没有做任何事情的情况下将对象保留在内存中?

这有可能吗?或者我应该放弃ARC而只是手动进行内存管理?

3 个答案:

答案 0 :(得分:2)

使用单例模式,以便Controller查看其自己的生命周期并存在于应用程序范围内。这个共享实例将从首次请求时开始存在,直到应用程序终止,ARC将不会任意释放它。

或者Controller.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;
}

答案 1 :(得分:1)

当详细说明detailViewController时,您的控制器正在被取消分配。因此,您必须移动控制器的句柄并在其中定义以下任何一个:

  1. MasterViewController或您的应用程序的RootViewController OR
  2. 的AppDelegate OR
  3. 按照“trojanfoe”
  4. 的说法创建一个单身人士

答案 2 :(得分:1)

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