码迷,mamicode.com
首页 > 移动开发 > 详细

iOS设计模式之单例模式

时间:2015-07-27 13:09:08      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:ios设计模式之单例模式   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



版权声明:本文为博主原创文章,未经博主允许不得转载。

iOS设计模式之单例模式

标签:ios设计模式之单例模式   ios   设计模式   设计   

原文地址:http://blog.csdn.net/judy_luo/article/details/47083491

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!