• ObjectiveC的单例模式(singleton)(转)


    如果你准备写一个类,希望保证只有一个实例存在,同时可以得到这个特定实例提供服务的入口,那么可以使用单态设计模式。
    单态模式在Java、C++中很常用,在Cocoa里,也可以实现。
    但是,
    Objective-C的单例模式绝对和你所想象不一样,他的写法和你所见过的所有语言的写法都不一样。
     
    官方建议
     
    由于自己设计单态模式存在一定风险,主要是考虑到可能在多线程情况下会出现的问题,因此苹果官方建议使用以下方式来实现单态模式:
    static MyGizmoClass *sharedGizmoManager = nil;
    + (MyGizmoClass*)sharedManager
    {
        @synchronized(self) {
            if (sharedGizmoManager == nil) {
                [[self alloc] init]; // assignment not done here
            }
        }
        return sharedGizmoManager;
    }
    + (id)allocWithZone:(NSZone *)zone
    {
        @synchronized(self) {
            if (sharedGizmoManager == nil) {
                sharedGizmoManager = [super allocWithZone:zone];
                return sharedGizmoManager;  // assignment and return on first allocation
            }
        }
        return nil; //on subsequent allocation attempts return nil
    }
    - (id)copyWithZone:(NSZone *)zone
    {
        return self;
    }
    - (id)retain
    {
        return self;
    }
    - (unsigned)retainCount
    {
        return UINT_MAX;  //denotes an object that cannot be released
    }
    - (void)release
    {
        //do nothing
    }
    - (id)autorelease
    {
        return self;
    }
     
    开源模板(见附件下载
    程序员都是偷懒的,现在流行使用一个宏定义来搞定这许多的事,而且考虑的更加周全。
    单例包含以下接口

    + (MyClass*) sharedInstance;
    + (void) purgeSharedInstance;
     
    调用sharedInstance会创建并返回单例
    调用purgeSharedInstance会销毁单例
    手动调用alloc也可以保证是单例,你可以这样调用
    [[MyClass alloc] initWithParam:firstParam secondParam:secondParam];
    只是要保证在sharedInstance之前调用,因为只有一次创建机会。
    下面是使用宏的写法“

    MyClass.h:
    ========================================
        #import "SynthesizeSingleton.h"

        @interface MyClass: SomeSuperclass
        {
            ...
        }
        SYNTHESIZE_SINGLETON_FOR_CLASS_HEADER(MyClass);

        @end
    ========================================


        MyClass.m:
    ========================================
        #import "MyClass.h"

        @implementation MyClass

        SYNTHESIZE_SINGLETON_FOR_CLASS(MyClass);

        ...

        @end
    ========================================
    本文出自 “ArthurChen” 博客

  • 相关阅读:
    java private修饰符的作用域
    debug运行下报错,但不影响运行ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2(转)
    非线程安全的HashMap 和 线程安全的ConcurrentHashMap(转载)
    【Java集合源码剖析】HashMap源码剖析(转)
    eclipse 解决乱码问题
    java替换txt文本中的字符串
    tomcat startup.bat 启动脚本(转)
    tomcat 点击startup.bat一闪而过
    tomcat 目录文件夹作用(转)
    引脚复用
  • 原文地址:https://www.cnblogs.com/zhwl/p/2310103.html
Copyright © 2020-2023  润新知