zoukankan      html  css  js  c++  java
  • IOS开发-单例

    单例

    • 单例的编写步骤

    1. 重写allocWithZone,用dispatch_once实例化一个静态变量
    2. 写一个+sharedXXX方便其他类调用
    • 单例代码

    1. //
      //  DemoObj.m
      //  05.单例
      //
      //  Created by apple on 14-4-23.
      //  Copyright (c) 2014年 itcast. All rights reserved.
      //
      
      #import "DemoObj.h"
      
      @implementation DemoObj
      
      static DemoObj *instance;
      
      // 在iOS中,所有对象的内存空间的分配,最终都会调用allocWithZone方法
      // 如果要做单例,需要重写此方法
      // GCD提供了一个方法,专门用来创建单例的
      + (id)allocWithZone:(struct _NSZone *)zone
      {
          static DemoObj *instance;
          
          // dispatch_once是线程安全的,onceToken默认为0
          static dispatch_once_t onceToken;
          // dispatch_once宏可以保证块代码中的指令只被执行一次
          dispatch_once(&onceToken, ^{
              // 在多线程环境下,永远只会被执行一次,instance只会被实例化一次
              instance = [super allocWithZone:zone];
          });
          
          return instance;
      }
      
      + (instancetype)sharedDemoObj
      {
          // 如果有两个线程同时实例化,很有可能创建出两个实例来
      //    if (!instance) {
      //        // thread 1 0x0000A
      //        // thread 2 0x0000B
      //        instance = [[self alloc] init];
      //    }
      //    // 第一个线程返回的指针已经被修改!
      //    return instance;
          return [[self alloc] init];
      }
      
      @end
  • 相关阅读:
    2020.8.20收获
    2020.8.19
    2020.8.21收获
    2020.8.24收获
    UIScrollView滑动动作结束的侦听函数
    iphone 自定义UISwitch
    总结SQLite不支持的SQL语法有哪些
    去除nsstring中的空格
    ObjectiveC中判断字符串是否包含其他字符串
    设置IPHONE顶部的状态栏的样式
  • 原文地址:https://www.cnblogs.com/wangyinghui/p/4346495.html
Copyright © 2011-2022 走看看