zoukankan      html  css  js  c++  java
  • iOS设计模式之单例模式

    单例模式:总是返回自己的同一个实例,它提供了对类的对象所提供的资源的全局訪问点,而且返回的实例仅仅能被实例化一次.

    单例设计模式设计须要考虑的两个问题:

    (1) :发起调用的对象不能以其它分配方式实例化单例对象,否则,就有可能创建单例类的多个实例

    (2) :对单例对象实例化的限制应该与引用计数内存模型共存.


    Singleton.h

    #import <Foundation/Foundation.h>


    @interface Singleton : NSObject


    +(Singleton *) sharedInstance;


    @end


    Singleton.m

    #import "Singleton.h"


    @implementation Singleton


    static Singleton *sharedSingleton = nil;


    +(Singleton *) sharedInstance{

        

        if (sharedSingleton == nil) {

            //sharedSingleton = [[Singleton alloc] init];

            //     --------->>>>>(1)

            //sharedSingleton = [[super allocWithZone:NULL] init];

            /*

                这里使用 super而不适用self的原因是self已经重载了allocWithZone方法

                所以通过调用父类的方法,实现内存的分配

                事实上allocWithZone方法内部调用的是NSAllocateObject方法

            */

            //     --------->>>>>(2)

            sharedSingleton = [NSAllocateObject([self class], 0, NULL) init];

            /*

                第一个參数是 类的类型

                第二个參数是 用于索引的实例变量的额外字节数,总是 0

                第三个參数是 用于指定内存中分配的区域,一般为NULL,表示为默认区域

                这里不适用(1)而使用(2)的原因是处理无论是实例化Singleton还是子类,都适用

             */

        }

        return sharedSingleton;

    }



    /*

        调用类的allocWithZone传入NSZone參数,为即将产生的新对象分配空间

        重载的目的是当使用对象的alloc方法时不会产生新的实例

        由于 alloc方法事实上调用的就是 allocWithZone:NULL方法,防止因 alloc而产生其它的实例

     

     */

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


        return [[self sharedInstance] retain];

    }



    /*

        这里重载copyWithZone的目的,是防止使用 copy 方法时产生其它的实例

     */

    -(id) copyWithZone:(NSZone *)zone{

        

        return self;


    }


    -(id) retain{

        

        return self;

    }


    -(NSUInteger) retainCount{

        

        return NSUIntegerMax;

    }


    -(void) release{

        

        //什么也不做


    }


    -(id) autorelease{

        

        return self;

    }


    @end



  • 相关阅读:
    求职准备:大一到大三,做好五件大事!
    研发过程管理导图第一稿(转)
    【推荐收藏】Visual Studio 插件库(转)
    提高C#编程水平的50个要点
    VC++和Matlab
    matlab混合编程向导(vc,vb,.net...)
    Matlab多线程运算的问题
    产生的DLL (VS2005, MATLAB7.5, mwArray)
    matlabsum函数用法
    SWFUpload V2.2.0 说明文档
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/7343895.html
Copyright © 2011-2022 走看看