iOS设计模式-单例

单例

单例:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

单例的使用场景

  1. 类只能有一个实例,而且必须从一个为人熟知的访问点对其进行访问。
  2. 这个唯一的实例只能通过子类话进行扩展,而且扩展的对象不会破坏客户端代码。

单例在CocoaTouch中的应用

在CocoaTouch中的UIApplication、UIAccelerometer、NSFileManager都是单例模式。

单例在Objective-C中的实现

1、为了保证对象的唯一性,先定义一个static(静态的)全局变量。

static Singleton *sharedSingleton = nil;

2、对外提供类方法作为访问点。

+ (Singleton*)sharedSingleton{
  if(sharedSingleton == nil){
    sharedSingleton = [[super allocWithZone:NULL] init];
  }
  return sharedSingleton;
}
  • 为什么使用allocWithZone:而不是alloc方法?
    由于所有的alloc最终都会调用allocWithZone:方法,只需要重写allocWithZone:方法就能保证alloc不出新的对象。

  • 为什么使用super而不是self?
    因为在self中重载了基本的对象分配方法,会导致死循环,所以需要借用其父类的方法。super和self关键字的区别

3、为了屏蔽通过alloc方法可以创建新的对象,需要重写allocWithZone:方法。

+ (id)allocWithZone:(NSZone*)zone{
  return [self sharedSingleton];
}

4、为了防止对象通过copy方法创建出新的对象,单例类需遵守NSCopying协议,并重写copyWithZone:方法。

- (id)copyWithZone:(NSZone*)zone{
  return self;
}

5、如果需要子类化单例对象时,由于我们重载了所有实例化相关方法,所以在其子类中调用super方法时,创建的还是该单例。所以要改造我们的单例方法为。

+ (Singleton*)sharedSingleton{
  if(sharedSingleton == nil){
      /**NSAllocateObject([self class], 0, NULL)方法中,第一个参数是singleton类的类型,第二个参数用语索引的实例变量的额外字节数,它总是0,第三个参数用于指定内存中分配的区域,它一般为NULL,表示默认区域*/
    sharedSingleton = [NSAllocateObject([self class], 0, NULL) init];
  }
  return sharedSingleton;
}

6、处理线程的安全性

+ (Singleton*)sharedSingleton{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
    sharedSingleton = [NSAllocateObject([self class], 0, NULL) init];
    });
  return sharedSingleton;
}

Objective-C中单例模式代码示例

Singleton.h

@interface Singleton : NSObject <NSCopying>

+ (Singleton*)sharedSingleton;

@end

Singleton.m

#import "Singleton.h"

@implementation Singleton

static Singleton *sharedSingleton = nil;

+ (Singleton*)sharedSingleton{

  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    sharedSingleton = [NSAllocateObject([self class], 0, NULL) init];
  });

  return sharedSingleton;
}

+ (id)allocWithZone:(NSZone*)zone{
  return [self sharedSingleton];
}

- (id)copyWithZone:(NSZone*)zone{
  return self;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值