单例初始化(MRC模式之autorelease)
最近在一项目中,在某个地方总是有内存闪退问题,经排查之后,终于找到问题所在。
项目中崩溃的地方使用单例写的(MRC模式),其中单例的初始化方法如下:
+ (GetCalendarEvents *)shareInstence
{
if (_get == nil) {
_get = [[[GetCalendarEvents alloc] init] autorelease];
_get.projectPlanArray = [[[NSMutableArray alloc] init] autorelease];
_get.todoArray = [[[NSMutableArray alloc] init] autorelease];
_get.noteArray = [[[NSMutableArray alloc] init] autorelease];
_get.workLogArray = [[[NSMutableArray alloc] init] autorelease];
_get.scheduleArray = [[[NSMutableArray alloc] init] autorelease];
_get.events = [[[NSMutableDictionary alloc] init] autorelease];
_get.chackDictionary = [[[NSMutableDictionary alloc] init] autorelease];
}
return _get;
}
上述代码中使用了autorelease,这在单例中会造成严重的内存泄露,因为单例模式下的autoRelease只有在程序退出的时候才释放,在单例模式最好不使用autoRelease,或者使用嵌套的AutoRelease release来处理。惨痛的教训。。。。可以改为如下代码而实现:
+ (GetCalendarEvents *)shareInstence
{
if (_get == nil) {
_get = [[GetCalendarEvents alloc] init];
}
return _get;
}
- (instancetype)init
{
self = [super init];
if (self) {
_projectPlanArray = [[NSMutableArray alloc] init];
_todoArray = [[NSMutableArray alloc] init];
_noteArray = [[NSMutableArray alloc] init];
_workLogArray = [[NSMutableArray alloc] init];
_scheduleArray = [[NSMutableArray alloc] init];
_events = [[NSMutableDictionary alloc] init];
_chackDictionary = [[NSMutableDictionary alloc] init];
}
return self;
}
本人也没怎么用过手动内存管理,只是公司的项目比较早。。。哎,好苦逼。。。。在此总结一下!!!!!