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

}

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

时间: 2024-12-29 10:25:25

单例初始化(MRC模式之autorelease)的相关文章

单例和工厂模式的创建

#pragma once class Config { private: static Config * con; Config(void); Config(const Config & con);//拷贝构造置为私有 public: float cpu; float memory; float harddisk; ~Config(void); //注意声明有static 静态. static Config * getInstance(); void creatInstance(); //工厂模

Swift百万线程攻破单例(Singleton)模式

一.不安全的单例实现 在上一篇文章我们给出了单例的设计模式,直接给出了线程安全的实现方法.单例的实现有多种方法,如下面: class SwiftSingleton { class var shared: SwiftSingleton { if !Inner.instance { Inner.instance = SwiftSingleton() } return Inner.instance! } struct Inner { static var instance: SwiftSingleto

设计模式课程 设计模式精讲 8-9 单例设计模式-容器模式

1 课程讲解 1.1 应用场景 2 代码演练 1.1 容器单例 1 课程讲解 1.1 应用场景 应用于在程序初始化的时候把多个单例对象放入到singletonMap中,使用的时候直接通过key获取对象.可以应用在懒汉模式中,不适用于饿汉模式(饿汉模式由于每次都要重新初始化会出现多线程安全问题) 使用hashtable会线程安全,但是由于其同步锁,会影响性能. 2 代码演练 1.1 容器单例 test类: package com.geely.design.pattern.creational.si

dispatch_once单例初始化

static GHCache *instance = nil; /** *  单例,静态初始化方法 * *  @return 返回一个单例 */ + (GHCache*)shareCache{ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ instance = [[self alloc] init]; }); return instance; }

单例—单例—单例 初始化方法

//单例的空间在整个程序运行的时候都不会被回收, 因此户存在内存泄露的情况, 他的存在是为了解决特定问题 ?初级 + (Singleton *)mainSingleton { //静态变量 static Singleton *single = nil; if (!single) { single = [[Singleton alloc]init]; } return single; } ?终极 + (id)defaultManager { //静态变量 static DatabaseManage

递归、闭包、私有变量、特权方法、单例、模块模式(module pattern)

//使用命名函数表达式实现递归 var factorial = (function f(num) {     if (num <= 1) {         return 1;     } else {         return num * f(num - 1);     } }); //用作块级作用域(私有作用域)的匿名函数 (function(){     var now = new Date();     if (now.getMonth() == 0 && now.get

springboot 响应消息 message简单封装 单例和原型模式

直接上代码: 1.定义静态方法 import com.alibaba.fastjson.JSON; public class MessageUtils implements Cloneable { private static final MessageUtils instance = new MessageUtils(); // 单例模式 public MessageUtils clone() { try { return (MessageUtils) super.clone(); } cat

PHP设计模式之工厂/单例/注册者模式

工厂模式 简单工厂模式 [静态工厂方法模式](Static Factory Method)是类的创建模式 工厂模式的几种形态: 1.简单工厂模式(Simple Factory)又叫做 静态工厂方法模式(Static Factory Method) 2.工厂方法模式(Factory Method)又叫做 多态性工厂模式(Polymorphic Factory) 3.抽象工厂模式(Abstract Factory)又叫做 工具箱模式(ToolKit) 创建工厂类 <?phprequire_once

单例和原型模式-创建型

单例模式 确保一个特殊类的实例是独一无二的(它是这个类的唯一实例),并且这个实例易于被访问. 解决方案 1)全局变量:一个全局变量使得一个对象可以被访问,但它不能防止你实例化多个对象.因为你的任何代码都能修改全局变量,这将不可避免的引起更多调试的意外.换句话说,全局变量的状态总是会出现一些问题的. 2)类构造函数私有和类自身的静态方法:让类自身负责保存它的唯一实例(静态变量).这个类可以保证没有其他实例可以被创建(通过截取创建新对象的请求) ,并且它可以提供一个访问该实例的方法(静态方法).这就