初识Objecive-C 之 单例模式

单例:保证一个类仅有一个实例,并提供一个访问它的全局访问点。它经常用于设计约束或者为了控制对有限资源的访问。

单例模式的思路是:一个类只能创建一个实例(永远是同一个)和一个活的该实例的方法(必须是类方法,通常使用getInstance)。

单例的实现:

#import "HeadMaster.h"

/*

 创建一个校长类实现单例模式

 1、为单例对象创建一个全局静态实例,并初始化,然后设置成nil

 2、实现工厂方法,并返回一个对象,检查上面声明的全局静态实例是否为nil

    如果是则新建并返回一个本类的实例,否则返回已经存在的本类的实例

 3、重写allocWithzone、copyWithZone方法

 4、重写retainCount、retain、release、autorelease方法

 */

@interface HeadMaster ()


+ (id) getInstance;


@end


//1.创建一个全局静态变量,并且初始化为nil

static HeadMaster *headMaster =nil;


@implementation HeadMaster


//2.实现工厂方法,返回一个单一对象

+ (id)getInstance{

    //方法枷锁、一次只能有一个线程进入

    @synchronized(self)

    {

        if (headMaster ==nil) {

            

            headMaster =[[selfalloc]init];

            

        }

    }

    returnheadMaster;

}


//3、为了防止通过alloc或者new创建新的实例,需要重写allocWithZone

+ (id)allocWithZone:(NSZone *)zone{

    

    @synchronized(self)

    {

        if (headMaster ==nil) {

            

            headMaster = [[superallocWithZone:zone]init];

            

        }

    }

    

    returnheadMaster;

}


//4、为了防止通过copy创建实例,需要重写copyWithZone

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

    

    returnheadMaster;

}


//5、重写retainCount方法,防止被dealloc,此方法返回最大值

- (NSUInteger)retainCount{

    

    returnNSUIntegerMax;

}


//6、重写retain方法,因为单例不释放,所以引用计数变化没有意义

- (id)retain{

    

    return self;

}


//7、重写release方法,因为单例不释放,所以引用计数变化没有意义

- (oneway void)release{

    

    /*

     oneway用在分布式对象的API,这些API可以在不同的线程,甚至是不同的程序。

     oneway关键字只用在返回类型为void的消息定义中,因为oneway是异步的,其消息预计不会立即返回。

     */

    

}


//8、重写autorelease方法,因为单例不释放,所以引用计数变化没有意义

- (id)autorelease{

    

    return self;

}


@end



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值