• 单例模式


    方法一:(用互斥锁实现)

    1、ARC中单例模式的实现:
    1.1在.m中保留一个全局的static的实例
    static id _instance;

    1.2重写allocWithZone:方法,在这里创建唯一的实例(注意线程安全)

    + (id)allocWithZone:(struct _NSZone *)zone

    {

        @synchronized(self) {

            if (!_instance) {

                _instance = [super allocWithZone:zone];

            }

        }

        return _instance;

    }

    1,3实现copyWithZone:方法

    + (id)copyWithZone:(struct _NSZone *)zone

    {

        return _instance;

    }

    1.4提供1个类方法让外界访问唯一的实例

    + (instancetype)sharedSoundTool

    {

        @synchronized(self) {

            if (!_instance) {

                _instance = [[self alloc] init];

            }

        }

        return _instance;

    }

    2、在非ARC(MRC)中实现单例模式

    2.1实现内存管理方法

    - (id)retain { return self; }

    - (NSUInteger)retainCount { return 1; }

    - (oneway void)release {}

    - (id)autorelease { return self; }

    方法二:(用dispatch_once来实现)

    + (id)allocWithZone:(struct _NSZone *)zone{

            static dispatch_once_t onceToken;

        dispatch_once(&onceToken, ^{

            NSLog(@"%s", __FUNCTION__);

            _instance = [super allocWithZone:zone];

        });

        return _instance;

    }

    + (id)copyWithZone:(struct _NSZone *)zone{

        return _instance;

    }

    + (id)sharedCZPlayer{

        //    线程不安全

    //    if (_instance == nil) {

    //       _instance = [[self alloc ] init];

    //    }

        //    线程安全

        static dispatch_once_t onceToken;

        dispatch_once(&onceToken, ^{

            if (!_instance ) {

                _instance = [[self alloc ] init];

            }

        });

        return _instance;

    }

    //  分布式

    - (oneway void)release{

    }

    - (NSUInteger)retainCount{

        return 1;

    }

    - (id)autorelease{

        return _instance;

    }

    - (id)retain{

        return _instance;

    }

    把单例抽取成宏

    #ifndef _4_________MRC__single_h

    #define _4_________MRC__single_h

    #define single_h(className) + (id)shared##className;

    #define single_m(className) static id _instance;

    + (id)allocWithZone:(struct _NSZone *)zone{

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{   

    NSLog(@"%s", __FUNCTION__);

    _instance = [super allocWithZone:zone];

    });

    return _instance;

    }  

    + (id)shared##className{ 

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{   

    if (!_instance ) { 

    _instance = [[self alloc ] init];  

    }  

    });

    return _instance;  

    }  

    - (oneway void)release{

    }

    - (NSUInteger)retainCount{ 

        return 1;  

    }  

    - (id)autorelease{ 

        return _instance;  

    }  

    - (id)retain{  

        return _instance;  

    }  

    + (id)copyWithZone:(struct _NSZone *)zone{  

        return _instance;  

    }

    #endif

  • 相关阅读:
    常用数据结构之哈希表
    常用数据结构之队列
    常用的数据结构之栈
    常用的数据结构之链表
    Zabbix3.4监控Windows机器CPU使用率
    在Pycharm中导入第三方模块库(诸如:matplotlib、numpy等)
    WARNING: You are using pip version 20.2.4; however, version 20.3.1 is available.
    npm无法安装node-sass的解决方法
    常见的树形结构封装
    Mac安装MySql
  • 原文地址:https://www.cnblogs.com/bluceZ/p/3942728.html
Copyright © 2020-2023  润新知