Objective-C的singleton模式


近因为在ios应用开发中,考虑到一些公共方法的封装使用,就决定使用单例模式的写法了。。不知道,Object-c中的单例模式的写法是否和java中的写法是否有所区别?
于是阿堂从网上一搜,发现“ Objective-C的singleton模式 ”一文被很多人
转载了,其主要内容如下

Apple官方建议

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

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;

  }

按照我在java开发中的经验,我一般会将其中的如下写法

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

  }

改成

static MyGizmoClass *sharedGizmoManager = nil;

  + (MyGizmoClass*)sharedManager

  {

  @synchronized(self) {

  if (sharedGizmoManager == nil) {

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

  }

  }

  return sharedGizmoManager;

  }

不懂这里还要弄个(id)allocWithZone:(NSZone *)zone起啥子用?

但是转念一想,既然Apple官方建议那样做,肯定是有它的作用的,于是阿堂决定写个测试demo,一探明细!

测试类

调用

控制台输出结果

至此终于真相大白了。。原来[[self alloc] init]; 调用时,会默认调用+
(id)allocWithZone:(NSZone
*)zone方法的。。sharedGizmoManager
 最终是在**allocWithZone:(NSZone
)zone方法中完成了初始化操作。。*

sharedGizmoManager = [super allocWithZone:zone];

阿堂再进一步查cocoa文档,原来allocWithZone:(NSZone
*)zone是在给对象
**sharedGizmoManager
分配内存空间了。其**中**zone** 可以想象成一个内存池,alloc,allocWithZone或是dealloc这些操作,都是在这个内存池中操作的。cocoa总是会配置一个默认的NSZone,任何默认的内存操作都是在这个“zone”上操作的。默认的NSZone的缺陷在于,它是全局范围的,时间一长,必然会导致内存的碎片化,如果你需要大量的alloc一些object,那么性能就会受到一些影响。所有cocoa提供方法,你可以自己生成一个NSZone(实际上就是我上面的demo那样,重写allocWithZone方法就行了),并将alloc,
copy全部限制在这个”zone“之内。

时间: 2024-10-05 04:42:13

Objective-C的singleton模式的相关文章

两种用于派生的Singleton模式(以TextureMgr为例)

Singleton,顾名思义,从字面上来理解就是单例模式,这是C++程序中 常用到的一种设计模式,特别是像文件管理器,纹理管理器这种整个软件 中只需要唯一的实例来管理所有资源时,这种模式的价值便得以体现. 下面来介绍两种用于派生管理的Singleton模式: 其中,第一种是Gof版本的Singleton, 其代码如下: //[Singleton_Gof.h] #pragma once template<typename T> class Singleton_Gof { protected: s

设计模式--singleton模式

使用单件模式的意图是保证一个类只有一个实例,并提供一个访问它的全局访问点. 将单件定义为全局或静态对象,然后依赖于自动的初始化,并不能完全实现上述意图.虽然可以提供全局访问点,但这是不够的.原因如下: 1)我们不能保证静态对象只有一个实例会被声明. 2)我们可能没有足够信息在静态初始化时实例化每个单件,单件可能需要在程序运行中稍后被计算出来的值. 3)c++没有定义转换单元上全局对象的构造器的调用顺序.这意味着单件之间不存在依赖关系:如果有,那么错误将是不可避免的. 4)使用全局或静态对象的实现

Java单态模式(Singleton模式)

定义:Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作. 还有,singleton能够被状态化:这样,多个单态类在一起就可以作为一个状态仓库一样向外提供服务,比如,你要论坛中的帖子计数器,每次浏览一次需要计数,单态类能否保持住这个计数,并且能synchronize的安全自动加1,如果你要把这个数字永久保存到数据库,你可以在不修改单态接口的情况下方便的做到. 另外方面,Singleton也能够

剑指offer (2) c++实现singleton模式

转自:http://www.jellythink.com/archives/82 问题描述 现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能:在实际开发过程中,会专门有一个日志模块,负责写日志,由于在系统的任何地方,我们都有可能要调用日志模块中的函数,进行写日志.那么,如何构造一个日志模块的实例呢?难道,每次new一个日志模块实例,写完日志,再delete,不要告诉我你是这么干的.在C++中,可以构造一个日志模块的全局变量,那么在任何地方就都可以用了,是的,不错.但是

C# 中的Singleton模式

一般写Singleton基本都是一下这个套路 class Singleton { public static Singleton instance; private Singleton() { } public static Singleton Getinstance() { if(instatnce == null) { instance = new Singleton(); } return instance; } } 但是今天学到一个C#独有的Singleton写法: class seal

跟刺猬哥一起学习设计模式【Singleton模式】

设计模式的分类 从目的来看: 创建型模式:负责对象创建 结构性模式:处理类与对象间的组合 行为型模式:类与对象交互中的职责分配 从范围来看: 类模式处理类与子类的静态关系 对象模式处理对象间的动态关系 动机 在软件系统中,经常有这样的一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性以及良好的效率. 如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例呢?其实这应该是类设计者的责任,而不是使用者的责任. 意图 保证一个类仅有一个实例,并提供一个该实例的全局访问点. 

设计模式:Registry of Singleton模式

原文地址:http://leihuang.org/2014/12/05/registry-of-singleton/ Creational 模式 物件的产生需要消耗系统资源,所以如何有效率的产生.管理 与操作物件,一直都是值得讨论的课题, Creational 模式即与物件的建立相关,在这个分类下的模式给出了一些指导原则及设计的方向.下面列举到的全属于Creational 模式 Simple Factory 模式 Abstract Factory 模式 Builder 模式 Factory Me

Singleton模式

Singleton模式 Singleton模式是解决怎么创建唯一对象问题的.在面向过程的设计语言中,我们可以通过创建全局对象来实现:在面向对象的设计语言中,也可以这样做,但是除此之外还有更好的解决方法:Singleton模式. Singleton模式十分简单,用一个static成员变量来记录唯一的对象实例,通过static接口来获取此实例,在类外禁用构造函数防止创建类的实例. 下面是Singleton模式的类图结构: 下面通过一个例子来演示.在例子中有一个data,初始化为0,创建一个实例,之后

模板singleton模式的C++实现

模板singleton模式的C++实现 近期回过头整理了一下singleton模式,看了别人写的关于singleton的介绍.发现这个singleton模式虽然简单,但要写一个稳定/线程安全/泛型的模板singleton,还是需要一点技巧的.经过整理,要写一个模板的singlton至少需要以下几个知识点: 1:singleton 2:static类成员实例延迟创建. 3:static类实例创建互斥实现,即线程安全. 4:double check技巧.  [Ref:http://www.ibm.c