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“之内。
相关推荐
本文实例讲述了go语言单例模式(Singleton)用法。分享给大家供大家参考。具体分析如下: 单例模式(Singleton):表示一个类只会生成唯一的一个对象。单例模式具有如下性质: A.这些类只能有一个实例; B.这些能够...
前言 object是Kotlin中的一个重要的关键字,也是Java中没有的。...语法含义:将类的声明和定义该类的单例对象结合在一起(即通过object就实现了单例模式) 基本示例 object RepositoryManager{ fun
单例模式的实现方式 将类实例绑定到类变量上 class Singleton(object): _instance = None def __new__(cls, *args): if not isinstance(cls._instance, cls): cls._instance = super(Singleton, cls).__new__...
在不同场景中没有单例的重复实例。 保证可以在任何Awake脚本之前运行的单入口点。 轻松的版本控制。 由于单例另存为ScriptableObjects,因此它们不在场景中,因此易于版本控制。 线程安全的LazySingleton。 ...
object object 相当于 class 的单个实例,通常在里面放一些静态的 field 或者 method 。 第一次调用 object 的方法...object 通常用于作为单例模式的实现或者放在 class 的静态成员。 object Person{ private var eye
要实现的一些目标:-在语言级别上嵌入一些设计模式(单例,状态模式)-后端实现字节代码生成-扩展编译器的优化阶段以优化字节代码-优化解释器以提高运行时性能。 -实施Hotspot-Compiler,用于将字节代码转换为x86...
设计模式之 Singleton(单态/单件) 阎宏博士讲解:单例(Singleton)模式 保证一个类只有一个实例,并提供一个访问它的全局访问点 设计模式之 Factory(工厂方法和抽象工厂) 使用工厂模式就象使用 new 一样频繁. ...
本文实例讲述了JavaScript设计模式之代理模式。分享给大家供大家参考,具体如下: 代理模式的定义,代理是一个对象(proxy)用它来控制目标对象的访问。为此他要是先与目标对象相同的接口,但是他不同于装饰者模式,它...
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....
1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是...
采用的是单例模式。 之后具体的调用,相关代码如下: if FindClass(fClsPer.ClassName) <> nil then begin tmpPer := TPersistentClass(FindClass(fClsPer.ClassName)).Create; Supports(tmpPer, StringToGUID('...
通知中心(NSNotificationCenter)采用单例的模式,整个系统只有一个通知中心,通过如下代码获取: //获取通知中心 [NSNotificationCenter defaultCenter]; 注册通知监听器方法: //observer为监听器 //aSelector...
3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能 5.容器提供了众多的辅助类,能加快应用的开发 6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,...
Struts1只是在第一次请求的时候创建一个action实例,以后每次相同的请求都直接从内存中去读取,它是单例模式,安全性较差。 Struts2是如何实现MVC模式的? 答:在Struts2里面是将每次页面的请求进行处理,然后将请求...
如有必要,重写Object类中hashCode 和equals •缓存实例的不可变类:如果程序经常需要使用不可变类的实例,则可对实例进行缓存。 抽象方法和抽象类 •抽象方法和类都必须使用abstract来修饰,有抽象...