IOS中单例模式的概念

单例模式:保证一个类中,有且只有一个实例存在并提供一个访问点供全局访问,该实例可以被所有的程序来访问。

一般有在,在这种情况下用:
1、当要用一个类时,又要用该类中的一个实例;
2、new 来创建实例时会给程序造成资源的浪费,而且实例越多也不好控制。
3、不同的线程调用时,可能会引起不同步的现象。

 

显然单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。

Objective-C Singleton 单例模式解析,单例模式就是只有一个实例,确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类。
objective c 单例模式,objective c 设计模式,objective c singleton 。
单例指一个唯一的,由全局共享的对象,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类。
 

官方建议

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

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; 
} 
 
由于单例模式基本要符合上面的设计,当有很多类都要设计成单例模式时,可以定义 
一个单例模板的宏,以提高程序的重用和减少不必要错误。 
#define SYNTHESIZE_SINGLETON_FOR_CLASS(classname)  
 
static classname *shared##classname = nil;  
 
+ (classname *)shared##classname  
{  
@synchronized(self)  
{  
if (shared##classname == nil)  
{  
shared##classname = [[self alloc] init];  
}  
}  
 
return shared##classname;  
}  
 
+ (id)allocWithZone:(NSZone *)zone  
{  
@synchronized(self)  
{  
if (shared##classname == nil)  
{  
shared##classname = [super allocWithZone:zone];  
return shared##classname;  
}  
}  
 
returnnil;  
}  
 
- (id)copyWithZone:(NSZone *)zone  
{  
returnself;  
}  
 
- (id)retain  
{  
returnself;  
}  
 
- (NSUInteger)retainCount  
{  
return NSUIntegerMax;  
}  
 
- (void)release  
{  
}  
 
- (id)autorelease  
{  
returnself;  
} 

 

 

 

 


 

经常来做应用程序级别的共享资源控制, 应该说这个模式的使用频率非常高, 现在来看看在Objective-C里面的实现方法.要实现一个Singleton Class, 至少需要做以下四个步骤:

1. 为Singleton Object实现一个静态实例, 初始化, 然后设置成nil.

2. 实现一个实例构造方法(通常命名为 sharedInstance 或者 sharedManager)检查上面声名的静态实例是否为nil, 如果是则新建并返回一个本类实例.

3. 重写 allocWithZone: 方法来保证当其他人直接使用 alloc 和 init 试图获得一个新实例的时候不会产生一个新的实例.

4. 适当的实现 copyWithZone:, release, retain, retainCount 和 autorelease.

 
static MyManager *sharedMyManager = nil;
@implementation MyManager

+ (id)instance {
  if(sharedMyManager == nil)
      sharedMyManager = [[super alloc] init];
    return sharedMyManager;
}

- (void)test{
  NSLog(@"share:%@",self);
}

 

 

 

posted @ 2012-09-21 11:48  LostInTheEcho  阅读(368)  评论(0)    收藏  举报