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; |
} |
如果人家让你写单例,你能够准确无误的写出单例,肯定会成功率比较高。加油