我在目标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而只是手动进行内存管理?
答案 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时,您的控制器正在被取消分配。因此,您必须移动控制器的句柄并在其中定义以下任何一个:
答案 2 :(得分:1)
在使用UITableView
时,我多次偶然发现了这个案例。我创建了一个私有@property (strong) id *yourObjectRetain
并将我的对象分配给它。多个对象的数组也可以使用。