`
sgm881218
  • 浏览: 56852 次
社区版块
存档分类
最新评论

Object-c中的单例模式

    博客分类:
  • ios
阅读更多

 

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起啥子用?

一探究竟:



 

调用



 

控制台输出结果



 

至此终于真相大白了。。原来[[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“之内。

 

 

  • 大小: 222 KB
  • 大小: 144.9 KB
  • 大小: 65.3 KB
1
0
分享到:
评论

相关推荐

    go语言单例模式(Singleton)实例分析

    本文实例讲述了go语言单例模式(Singleton)用法。分享给大家供大家参考。具体分析如下: 单例模式(Singleton):表示一个类只会生成唯一的一个对象。单例模式具有如下性质: A.这些类只能有一个实例; B.这些能够...

    kotlin中object关键字的三种使用场景

    前言 object是Kotlin中的一个重要的关键字,也是Java中没有的。...语法含义:将类的声明和定义该类的单例对象结合在一起(即通过object就实现了单例模式) 基本示例 object RepositoryManager{ fun

    详解python单例模式与metaclass

    单例模式的实现方式 将类实例绑定到类变量上 class Singleton(object): _instance = None def __new__(cls, *args): if not isinstance(cls._instance, cls): cls._instance = super(Singleton, cls).__new__...

    yaSingleton:Unity3d的单例模式实现。 基于ScriptableObjects而非常规的MonoBehaviour方法

    在不同场景中没有单例的重复实例。 保证可以在任何Awake脚本之前运行的单入口点。 轻松的版本控制。 由于单例另存为ScriptableObjects,因此它们不在场景中,因此易于版本控制。 线程安全的LazySingleton。 ...

    Scala 【 7 object 】

    object object 相当于 class 的单个实例,通常在里面放一些静态的 field 或者 method 。 第一次调用 object 的方法...object 通常用于作为单例模式的实现或者放在 class 的静态成员。 object Person{ private var eye

    Concurrent Object-Oriented Language:面向对象的语言,用于并发软件开发-开源

    要实现的一些目标:-在语言级别上嵌入一些设计模式(单例,状态模式)-后端实现字节代码生成-扩展编译器的优化阶段以优化字节代码-优化解释器以提高运行时性能。 -实施Hotspot-Compiler,用于将字节代码转换为x86...

    二十三种设计模式【PDF版】

    设计模式之 Singleton(单态/单件) 阎宏博士讲解:单例(Singleton)模式 保证一个类只有一个实例,并提供一个访问它的全局访问点 设计模式之 Factory(工厂方法和抽象工厂) 使用工厂模式就象使用 new 一样频繁. ...

    JavaScript设计模式之代理模式实例分析

    本文实例讲述了JavaScript设计模式之代理模式。分享给大家供大家参考,具体如下: 代理模式的定义,代理是一个对象(proxy)用它来控制目标对象的访问。为此他要是先与目标对象相同的接口,但是他不同于装饰者模式,它...

    java 面试题 总结

    Inc inc=tt.new Inc(); Dec dec=tt.new Dec(); for(int i=0;i;i++){ Thread t=new Thread(inc); t.start(); t=new Thread(dec); t.start(); } } private synchronized void inc(){ j++; System.out.println(Thread....

    超级有影响力霸气的Java面试题大全文档

    1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是...

    Delphi最新三层源码

    采用的是单例模式。 之后具体的调用,相关代码如下: if FindClass(fClsPer.ClassName) <> nil then begin tmpPer := TPersistentClass(FindClass(fClsPer.ClassName)).Create; Supports(tmpPer, StringToGUID('...

    ios NSNotificationCenter通知的简单使用

    通知中心(NSNotificationCenter)采用单例的模式,整个系统只有一个通知中心,通过如下代码获取: //获取通知中心 [NSNotificationCenter defaultCenter]; 注册通知监听器方法: //observer为监听器 //aSelector...

    Spring面试题

    3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能 5.容器提供了众多的辅助类,能加快应用的开发 6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,...

    java面试题

    Struts1只是在第一次请求的时候创建一个action实例,以后每次相同的请求都直接从内存中去读取,它是单例模式,安全性较差。 Struts2是如何实现MVC模式的? 答:在Struts2里面是将每次页面的请求进行处理,然后将请求...

    【05-面向对象(下)】

    如有必要,重写Object类中hashCode 和equals •缓存实例的不可变类:如果程序经常需要使用不可变类的实例,则可对实例进行缓存。 抽象方法和抽象类 •抽象方法和类都必须使用abstract来修饰,有抽象...

Global site tag (gtag.js) - Google Analytics