iOS开发:Objective-C的singleton模式-阿里云开发者社区

开发者社区> 开发与运维> 正文

iOS开发:Objective-C的singleton模式

简介:

本文主要介绍了iOS开发模式中的singleton模式,如果你准备写一个类,希望保证只有一个实例存在,同时可以得到这个特定实例提供服务的入口,那么可以使用单态设计模式。

  单态模式在Java、C++中很常用,在Cocoa里,也可以实现。

  但是,

  Objective-C的单例模式绝对和你所想象不一样,他的写法和你所见过的所有语言的写法都不一样。

  官方建议

  由于自己设计单态模式存在一定风险,主要是考虑到可能在多线程情况下会出现的问题,因此苹果官方建议使用以下方式来实现单态模式:

  static MyGizmoClass *sharedGizmoManager = nil;

  + (MyGizmoClass*)sharedManager

  {

  @synchronized(self) {

  if (sharedGizmoManager == nil) {

  [[self alloc] init]; // assignment not done here

  }

  }

  return sharedGizmoManager;

  }

  + (id)allocWithZone:(NSZone *)zone

  {

  @synchronized(self) {

  if (sharedGizmoManager == nil) {

  sharedGizmoManager = [super allocWithZone:zone];

  return sharedGizmoManager; // assignment and return on first allocation

  }

  }

  return nil; //on subsequent allocation attempts return nil

  }

  - (id)copyWithZone:(NSZone *)zone

  {

  return self;

  }

  - (id)retain

  {

  return self;

  }

  - (unsigned)retainCount

  {

  return UINT_MAX; //denotes an object that cannot be released

  }

  - (void)release

  {

  //do nothing

  }

  - (id)autorelease

  {

  return self;

  }

  程序员都是偷懒的,现在流行使用一个宏定义来搞定这许多的事,而且考虑的更加周全。

  单例包含以下接口

  + (MyClass*) sharedInstance;

  + (void) purgeSharedInstance;

  调用sharedInstance会创建并返回单例

  调用purgeSharedInstance会销毁单例

  手动调用alloc也可以保证是单例,你可以这样调用

  [[MyClass alloc] initWithParam:firstParam secondParam:secondParam];

  只是要保证在sharedInstance之前调用,因为只有一次创建机会。

  下面是使用宏的写法“

  MyClass.h:

  ========================================

  #import "SynthesizeSingleton.h"

  @interface MyClass: SomeSuperclass

  {

  ...

  }

  SYNTHESIZE_SINGLETON_FOR_CLASS_HEADER(MyClass);

  @end

  ========================================

  MyClass.m:

  ========================================

  #import "MyClass.h"

  @implementation MyClass

  SYNTHESIZE_SINGLETON_FOR_CLASS(MyClass);

  ...

  @end

  ========================================










本文转自 wws5201985 51CTO博客,原文链接:http://blog.51cto.com/wws5201985/760988,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章