ios 单例模式


<span style="font-size:18px;">单例:一个类只有一个实例,在外部创建对象,不能用alloc,(只要alloc,就会在堆区开辟空间,就意味有多个对象)
所以我们要提供一个创建对象的方法,而且是一个+号方法
</span><span style="font-family:KaiTi_GB2312;font-size:18px;">1.单例模式的要点:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。
2.单例模式的优点:a.实例控制Singleton会阻止其他对象实例化其自己的Singleton对象的副本,从而确保所有对象都访问唯一实例。  
b.灵活性:因为类控制了实例化过程,所以类可以更加灵活修改实例化过程IOS中的单例模式  
在objective-c中要实现一个单例类,至少需要做以下四个步骤:  
1、为单例对象实现一个静态实例,并初始化,然后设置成nil,  
2、实现一个实例构造方法检查上面声明的静态实例是否为nil,如果是则新建并返回一个本类的实例,  
3、重写allocWithZone方法,用来保证其他人直接使用alloc和init试图获得一个新实力的时候不产生一个新实例,  
4、适当实现allocWitheZone,copyWithZone,release和autorelease。</span>


#import <Foundation/Foundation.h>


@interface CLPen : NSObject
定义一个单例:一般用+号方法  以default , standard , main, shared 开头  + 上类名
例如: + (CLPen *)sharedCLPen;
@end


#import "CLPen.h"

@implementation CLPen 


写法一 (错误的) 此方法是可能会同时创建多个对象 而单例目的是一个类只有一个对象

 + (CLPen *)sharedCLPen
 {
 static CLPen *pen = nil;
 if (pen == nil) {
 pen = [[CLPen alloc] init];
 }
 return pen;
 }


写法二 <pre name="code" class="objc">@synchronized 没有提示 所以比较容易书写错误

 + (CLPen *)sharedCLPen
 {

 static CLPen *pen = nil;

 @synchronized(self){

 if (pen == nil) {

 pen = [[CLPen alloc] init];
 }
 
 }
 return pen;
 
 }

 
写法三(通常书写的方式)


+ (CLPen *)sharedCLPen {
<pre name="code" class="objc">第一步:为单例对象实现一个静态实例,并初始化,然后设置成nil,

static CLPen *pen = nil;

第二步:实例构造检查静态实例是否为nil 


static dispatch_once_t onceToken; 保证里面的方法只执行一次

dispatch_once(&onceToken, ^{pen = [[CLPen alloc] init];});
 return pen;
}
@end


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值