我在 Objective C 中遇到内存管理问题。我一直在阅读高级内存管理编程指南 https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html但我无法找到解决问题的方法,除了完全放弃 ARC 并手动管理内存之外。
问题是这样的:
我有一个Controller
我制作的课程,其中包含有关在特定时间做什么的信息。
The Controller
类告诉应用程序的其余部分播放视频(例如)。视频播放正常。当视频播放完毕后,Controller
班级知道下一步该做什么。
不幸的是Controller
几乎在视频开始播放时,ARC 就会释放并释放该类。因此,当视频结束时,应用程序会调用Controller
类来查看下一步应该做什么,然后整个事情就崩溃了。我得到一个EXC_BAD_ACCESS
因为班级已经不在记忆中了。
我知道 ARC 正在释放我的Controller
类,因为在它告诉视频开始播放后,它没有做任何事情。但我想保留这门课,直到我再次需要它。
我将此类声明为属性,如下所示:
@property (strong, nonatomic) Controller * controller;
但尽管如此,ARC 仍然会在不执行任何操作时立即释放该类。
EDIT:
我已将此属性移至应用程序委托中。但 ARC 仍在发布它。我无法将其变成单例,因为我需要拥有此类的多个副本。
当我不希望 ARC 释放对象时,如何停止它?
是否可以在不执行任何操作的情况下将对象保留在内存中?
这有可能吗?或者我应该放弃 ARC 并手动进行内存管理?
使用单例模式,以便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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)