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];的形式创建一个对象,那么就不会共享类方法创建的对象。

  • 相关阅读:
    测试用例设计白皮书--测试用例设计综合策略
    流程控制
    与用户交互,格式化输出,基本运算符
    jupyter的安装
    python程序运行的方式、变量、注释、内存管理、数据类型
    博客园 文章爬取(乱写的,有的爬不下来)
    Python 九九乘法表打印
    Python 爬歌曲
    redis快速入门
    UDPsocket编程
  • 原文地址:https://www.cnblogs.com/allanliu/p/4222198.html
Copyright © 2011-2022 走看看