单例初始化(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;

}

本人也没怎么用过手动内存管理,只是公司的项目比较早。。。哎,好苦逼。。。。在此总结一下!!!!!

posted on 2016-02-02 11:16  X了个code  阅读(319)  评论(0编辑  收藏  举报