单例

1)在ios开发中,单例的应用非常广。是在内存中只有唯一的实例,并且提供一个全局的访问方法。

----------------系统的

UIApplication:应用程序启动后唯一的副本

NSFlieManager:处理文件低些操作

NSUserDefault:用户偏好读写

NSNotificationCenter:监听通知/派发任务

----------------常用的实例

音乐播放器

网络请求

MVVM处理逻辑的单例

2)实现:

alloc方法会调用allocWithZone方法。既然所有内存分配最终都是allocWithZone,如果能保证只实例化一个副本。就像懒加载,写get方法目的也是为了属性只被实例化一次。

/**

 1. 定义一个静态的实例成员=>保证对象在内存中只有一个副本,而且是保存在静态区的

 

 static id instance;

 

 2. 提供一个全局的访问方法,都以 shared + 类名 格式定义

 

 + (instancetype)sharedSoundTools;

 

 3. 重写 allocWithZone 方法,=> 保证对象只被实例化一次,只分配一次内存空间

 static dispatch_once_t onceToken;

 dispatch_once(&onceToken, ^{

    instance = [super allocWithZone:zone];

 });

 return instance;

 

 4. 实现 shared 方法 => 保证对象只被 init(初始化) 一次

 static dispatch_once_t onceToken;

 dispatch_once(&onceToken, ^{

    instance = [[self alloc] init];

 });

 return instance; 

 */

 

+(instancetype)allocWithZone:(struct _NSZone *)zone {

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [super allocWithZone:zone];
    });
    return  instance;
}

 

+(instancetype)sharedTools {

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[self alloc] init];

    });
    return instance;
}

// 先调用类方法sharedTools,然后只执行一次dispatchOnce实例化局部变量instanceself alloc会调用到allocWithZone,也一次执行生成单例变量。然后之后在调用sharedTools直接就返回instance了,因为在静态区,所以永远都这一个实例。

(3)Swift单例:

 static let sharedTools = NetWorkTools();

 

posted @ 2016-11-10 17:00  三更小新  阅读(150)  评论(0编辑  收藏  举报