zoukankan      html  css  js  c++  java
  • dispatch_once创建单例

     

           单例是开发中使用最常见的一种设计模式,无论创建多少个对象,都返回同一个实例,共享一块内存。OC创建单例,基本上就是定义一个类方法,在里面创建一个 对象,然后返回该对象,下次在创建的时候就会判断是否存在该对象,如果有直接返回,没有则重新创建,当然这个对象是保存在全局静态区的。苹果引入了 GCD,代码量就简化了很多,因此可以使用GCD当中的   void dispatch_once(dispatch_once_t *predicate,dispatch_block_t block) 函数来帮助用户创建一个单例,简单易懂。

    //
    #import <Foundation/Foundation.h>
     
    @interface Person : NSObject
     
    + (id)shareInstance;
    //+ (id)sharedManager;
    @end
    //
    #import "Person.h"
    //static Person *per = nil;
     
    @implementation Person
     
    + (id)shareInstance
    {
        static Person *per = nil;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            per = [[Person alloc] init];
        });
        return  per;
        
        
    }
     
     
    /*
    + (id)sharedManager
    {
        @synchronized (self){
            if (per == nil) {
                per = [[super allocWithZone:NULL] init];
            }
        }
        return per;
    }
     
    + (id)allocWithZone:(NSZone *)zone
    {
        return [[self sharedManager] retain];
    }
     
    - (id)copyWithZone:(NSZone *)zone
    {
        return self;
    }
     
    - (id)retain
    {
        return self;
    }
     
    - (NSUInteger)retainCount
    {
        return NSUIntegerMax;
    }
     
    - (oneway void)release
    {
        //do nothing
    }
     
    - (id)autorelease
    {
        return self;
    }
    */
     
    @end

    优点:线程安全,不用写@synchronized,或者NSLock 来保证线程安全。

    缺点:如果用户使用Person *per = [[Person alloc] init];的形式创建一个对象,那么就不会共享类方法创建的对象。

  • 相关阅读:
    tmp:算法数据结构
    [转]Open Live Writer 配置
    GCC ,Clang 与 make,cmake 一览
    概率统计(1):数据分布
    ISP基础(31):Lost Frame Strategy
    支付宝对接授权及加好友
    css实现定宽高比(非内容撑出)
    display:table实现多列等高布局
    vue挂载全局组件
    两个数组根据指定字段去重
  • 原文地址:https://www.cnblogs.com/allanliu/p/4222198.html
Copyright © 2011-2022 走看看