iOS单例

转自:http://blog.csdn.net/yangzychina/article/details/9305533

最近在面试,有些总是会被问到,突然觉得自己虽然做了有一年多的iOS,也自己开发过几款应用,但是有些基础终究感觉自己狠模糊。
从现在起开始看中基础,理论。

 
被问到的两个比较多的问题, 单例以及什么是KVO和KVC。
首先说单例模式。
 
单例的概念(Singleton):创建某类对象时,无论创建多少次该类对象只有一份在内存中,通俗的将就是只存在这个类的一个势力对象。
在iOS中,有两种单例实现模式,以下为例子。
1.使用 static 管理
@interface Singleton:NSObject
 
@end
 
@implement

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;
}

 

 

如果人家让你写单例,你能够准确无误的写出单例,肯定会成功率比较高。加油

posted on 2014-01-07 15:31  王培  阅读(225)  评论(0编辑  收藏  举报

导航