zoukankan      html  css  js  c++  java
  • 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” 博客

  • 相关阅读:
    firefox远程调试
    PHP使用unset销毁变量并释放内存(转)
    去掉超级链接的虚线框
    如何减少 reflow(回流)和 repaint(重绘)
    Chrome远程调试
    3大mobile浏览器远程调试
    IE6下使用滤镜后链接无法点击的BUG
    让IE6区块元素具备display:inlineblock属性
    Call to undefined function curl_init()解决方法(转)
    CSS3 Gradient
  • 原文地址:https://www.cnblogs.com/zhwl/p/2310103.html
Copyright © 2011-2022 走看看