• 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



  • 相关阅读:
    zzuli---1912---小火山的爱情密码
    zzuli---1907---
    zzuli---1899---985的最大和难题
    zzuli---1898---985的数字难题
    Light oj ---1058---poj---1971---Parallelogram Counting
    UVA---10200
    poj---1064---Cable master
    hdu---5423---Rikka with Tree
    fzu---2128
    Bookshelf 2 01背包
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/7343895.html
Copyright © 2020-2023  润新知