zoukankan      html  css  js  c++  java
  • 创建线程安全的单例(ARC或 非ARC)

    一:创建 宏 文件 SynthesizeSingleton.h

    SynthesizeSingleton.h
    
    #if __has_feature(objc_arc) // ARC Version
    
    #define SYNTHESIZE_SINGLETON_FOR_CLASS(classname)   
    
    + (classname *)shared##classname
    {
        static classname *shared##classname = nil;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            shared##classname = [[classname alloc] init];
        });
        return shared##classname;
    }
    
    #else // Non-ARC Version
    
    #define SYNTHESIZE_SINGLETON_FOR_CLASS(classname) 
    static classname *shared##classname = nil; 
    + (classname *)shared##classname 
    { 
        @synchronized(self) 
        { 
            if (shared##classname == nil) 
            { 
                shared##classname = [[self alloc] init]; 
            } 
        } 
        return shared##classname; 
    } 
    
    + (id)allocWithZone:(NSZone *)zone 
    { 
    @synchronized(self) 
    { 
    if (shared##classname == nil) 
    { 
    shared##classname = [super allocWithZone:zone]; 
    return shared##classname; 
    } 
    } 
    return nil; 
    } 
    - (id)copyWithZone:(NSZone *)zone 
    { 
    return self; 
    } 
    - (id)retain 
    { 
    return self; 
    } 
    - (NSUInteger)retainCount 
    { 
    return NSUIntegerMax; 
    } 
    - (oneway void)release 
    { 
    } 
    - (id)autorelease 
    { 
    return self; 
    }
    
    #endif
    

      二:使用

    MyClass.h
    
    @interface MyClass : NSObject
    
    +(DataStorage *)sharedMyClass;
    
    @end
    MyClass.m
    
    #import "SynthesizeSingleton.h"
    @implementation MyClass
    SYNTHESIZE_SINGLETON_FOR_CLASS(MyClass)
    @end
    

     参考资料

  • 相关阅读:
    C语言调用VIX_API开关虚拟机
    (转)Vix_API 操作 VMware
    C# U盘扫描
    设置字符集
    LIS系统通讯程序原理与实现
    Linux命令的简写和全称
    远程桌面如何退出全屏或全屏切换
    C#编程总结(七)数据加密
    c# 小叙 Encoding(三)
    c# 小叙 Encoding(二)
  • 原文地址:https://www.cnblogs.com/cocoajin/p/3176265.html
Copyright © 2011-2022 走看看