iOS单例
转自:http://blog.csdn.net/yangzychina/article/details/9305533
最近在面试,有些总是会被问到,突然觉得自己虽然做了有一年多的iOS,也自己开发过几款应用,但是有些基础终究感觉自己狠模糊。
从现在起开始看中基础,理论。
static Singleton*sharedSingleton= nil;
+(Singleton*) sharedInstance{ 
 
  @synchronized(self)
  {     
     if (sharedSingleton== nil)
     {          
        sharedSingleton= [[Singleton alloc] init];       
     }   
  }
  return sharedSingleton; 
}
+(id) allocWithZone:(NSZone *)zone
{   
   @synchronized(self)
   {       
      if (sharedSingleton== nil)
     {   
        sharedSingleton= [super allocWithZone:zone];     
         returnsharedSingleton;      
     }
   }   
   return nil; 
}
- (id)copyWithZone:(NSZone *)zone{
return self;
}
-(id)retain{
return self;
}
- (void)release{
//do nothing
}
-(id)autorelease{
return self;
}
@end
使用synchronized()可以防止多个线程同时执行该段代码(线程锁)
NSZone: 简单来说可以把它想象成一个内存池,alloc或者dealloc这些操作都是在这个内存池中操作的,cocoa总是会分配一个默认的NSZone,任何 默认内存操作都是在这个zone上进行的,使用默认zone存在缺陷,因为他是全局范围的,频繁使用会导致内存的碎片化,尤其是大量的alloc和 dealloc的时候,性能上会受到一定影响。因为你可以自己生成一个zone并将alloc,copy这些限制在这个zone中。
第二种是使用 GCD,不用synchronized,比较官方的例子
@implement
static Singleton*sharedSingleton= nil;
+(Singleton*) sharedInstance{ 
static dispatch_once_t onceToken;
dispatch_once(&onceToken,^{
sharedSingleton = [super allocWithZone:nil] init];
}
return instance;
}
+(id) allocWithZone:(NSZone*)zone {return[self sharedInstance];}
@end
以下是苹果官方的例子。
static MyGizmoClass *sharedGizmoManager = nil;  | 
+ (MyGizmoClass*)sharedManager  | 
{
 | 
    if (sharedGizmoManager == nil) {
 | 
sharedGizmoManager = [[super allocWithZone:NULL] init];  | 
}  | 
return sharedGizmoManager;  | 
}  | 
+ (id)allocWithZone:(NSZone *)zone  | 
{
 | 
return [[self sharedManager] retain];  | 
}  | 
- (id)copyWithZone:(NSZone *)zone  | 
{
 | 
return self;  | 
}  | 
- (id)retain  | 
{
 | 
return self;  | 
}  | 
- (NSUInteger)retainCount  | 
{
 | 
return NSUIntegerMax; //denotes an object that cannot be released  | 
}  | 
- (void)release  | 
{
 | 
//do nothing  | 
}  | 
- (id)autorelease  | 
{
 | 
return self;  | 
}  | 
如果人家让你写单例,你能够准确无误的写出单例,肯定会成功率比较高。加油
                    
                
                
            
        
浙公网安备 33010602011771号