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
}
}
returnnil; //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];
下面是使用宏的写法“
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

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

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

有人写了测试allocWithZone的例子:http://blog.sina.com.cn/s/blog_4c925dca01011bzs.html

-------------------------------------------------------分割线-----------------------------------------------------------

再转一篇关于单例模式实现的文章:

http://unmi.cc/objective-c-dp-singleton

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值