IOS开发-单例模式

一般情况我们都是这么写:

static MySingleton *shareSingleton;

+( instancetype ) sharedSingleton  {

static  dispatch_once  onceToken;

dispatch_once ( &onceToken, ^ {

shareSingleton = [ [ MySingleton alloc ] init ] ;

} );

return sharedSingleton;

}

但是调用shareInstance方法时获取到的对象是相同的,但是当我们通过alloc和init来构造对象的时候,有时候得到的对象却是不一样的。创建对象的步骤分为申请内存(alloc)、初始化(init)这两个步骤,我们要确保对象的唯一性,因此在第一步这个阶段我们就要拦截它。当我们调用alloc方法时,oc内部会调用allocWithZone这个方法来申请内存,我们覆写这个方法,然后在这个方法中调用shareInstance方法返回单例对象,这样就可以达到我们的目的。拷贝对象也是同样的原理,覆写copyWithZone方法,然后在这个方法中调用shareInstance方法返回单例对象。所以建议以后安全一点都这么写:

static  MySingleton  *shareSingleton = nil;

+( instancetype ) sharedSingleton  {

static  dispatch_once  onceToken;

dispatch_once ( &onceToken, ^ {

shareSingleton  =  [[super allocWithZone:NULL] init] ;

} );

return sharedSingleton;

}

+(id) allocWithZone:(struct _NSZone *)zone {

return [Singleton shareInstance] ;

}

-(id) copyWithZone:(struct _NSZone *)zone {

return [Singleton shareInstance] ;

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • iOS开发—单例模式 一、简单说明: 设计模式:多年软件开发,总结出来的一套经验、方法和工具 二、单例模式说明 (...
    牛仔裤小毛驴阅读 664评论 0 0
  • 单例模式 什么是单例模式? 单例模式想一个大独裁者,他规定在他的国度里面,所有数据的访问和请求都得经过他,甚至你要...
    GitHubPorter阅读 1,199评论 0 4
  • 什么是单例模式? >是开发设计模式(共23种)中的1种 >它可以保证在程序运行过程,一个类只有一个实例(一个对象)...
    泥孩儿0107阅读 265评论 0 0
  • 近期会对ios开发过程中常用的设计模式进行简单的归纳总结,希望大家继续关注我的博客; iOS开发常见设计模式:MV...
    王小智阅读 3,652评论 0 13
  • 一个妈妈阅读 217评论 0 1