zoukankan      html  css  js  c++  java
  • 单例

    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();
  • 相关阅读:
    读取ClassPath下resource文件的正确姿势
    动画展现十大经典排序算法(附Java代码)
    定量度量程序复杂度的McCabe方法
    从一个例子入门Mysql储存过程
    从源码看Spring Security之采坑笔记(Spring Boot篇)
    函数传递参数的本质
    main函数是必须的吗
    变量存储与长度
    C语言与汇编衔接1
    关于function和task的说明
  • 原文地址:https://www.cnblogs.com/sgxx/p/6051603.html
Copyright © 2011-2022 走看看