zoukankan      html  css  js  c++  java
  • 单例模式

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

    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

  • 相关阅读:
    The Mac Application Environment 不及格的程序员
    Xcode Plugin: Change Code In Running App Without Restart 不及格的程序员
    The property delegate of CALayer cause Crash. 不及格的程序员
    nil localizedTitle in SKProduct 不及格的程序员
    InApp Purchase 不及格的程序员
    Safari Web Content Guide 不及格的程序员
    在Mac OS X Lion 安装 XCode 3.2 不及格的程序员
    illustrate ARC with graphs 不及格的程序员
    Viewing iPhoneOptimized PNGs 不及格的程序员
    What is the dSYM? 不及格的程序员
  • 原文地址:https://www.cnblogs.com/bluceZ/p/3942728.html
Copyright © 2011-2022 走看看