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

  • 相关阅读:
    mysql增加字段,修改字段,增加索引等语句
    php获取post参数的几种方式
    微信小程序开发注意事项
    jQuery的deferred对象详解
    jquery.pagination.js的使用
    js实现一键复制
    PHP读取文件内容的五种方式
    3.3 模块的搜索路径
    3.2 py文件的两种功能
    3.1 模块的定义与分类,import,from...import
  • 原文地址:https://www.cnblogs.com/allanliu/p/4222198.html
Copyright © 2011-2022 走看看