0

我在目标 C 中遇到内存管理问题。我一直在阅读高级内存管理编程指南,但除了完全放弃 ARC 并手动管理内存之外,我找不到解决问题的方法。

这是问题所在:

我有一个Controller我做过的课程,其中包含有关在特定时间做什么的信息。

该类Controller告诉应用程序的其余部分播放视频(例如)。视频播放良好。视频播放完毕后,Controller全班就知道下一步该做什么。

不幸的Controller是,几乎在视频开始播放时,ARC 就释放并释放了该类。因此,当视频结束时,应用程序会调用Controller该类以查看下一步应该做什么,然后整个事情就崩溃了。我得到一个,EXC_BAD_ACCESS因为该类不再在内存中。

我知道 ARC 正在发布我的Controller课程,因为在它告诉视频开始播放之后,它什么也没做。但我想保留那个课程,直到我再次需要它。

我将此类声明为属性,如下所示:

@property (strong, nonatomic) Controller * controller;

但尽管如此,ARC 会在它不做任何事情时继续释放该类。

编辑:

我已将此属性移到 App Delegate 中。但 ARC 仍在发布它。我不能把它变成一个单例,因为我需要拥有这个类的多个副本。

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

是否可以在不做任何事情时将对象保留在内存中?

这可能吗?还是我应该放弃 ARC 并手动进行内存管理?

4

3 回答 3

2

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

控制器.h:

@interface Controller : NSObject

+ (Controller *)sharedInstance;

@end

控制器.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;
}
于 2013-10-29T10:08:08.703 回答
1

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

  1. MasterViewController 或您的应用程序的 RootViewController 或
  2. AppDelegate 或
  3. 创建一个由“trojanfoe”回答的单例
于 2013-10-29T10:17:17.583 回答
1

在与UITableViews. 我创建了一个私有@property (strong) id *yourObjectRetain对象并将我的对象分配给它。多个对象的数组也可以工作。

于 2013-10-29T13:48:34.740 回答