1。dispatch_once ( &dispatch_once_t , block )
e.g.
static dispatch_once_t onceToken;
void (^executedOnlyOnce)(void) = ^{
static NSUInteger numberOfEntries = 0;
numberOfEntries++;
NSLog(@"Executed %lu time(s)", (unsigned long)numberOfEntries);
};
-(void)action{
dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_once(&onceToken, ^{
dispatch_async(concurrentQueue, executedOnlyOnce);
});
dispatch_once(&onceToken, ^{
dispatch_async(concurrentQueue, executedOnlyOnce); //executedOnlyOnce不执行
});
}
2。单例的使用
@implementation MySingleton
+(instancetype) sharedInstance{
static MySingleton *SharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
SharedInstance = [MySingleton new]; //保证只被实例化一次
});
return SharedInstance;
}
@end
postscript:
id 和 instancetype 区别:对于类方法的返回类型,使用instancetype更合适,它能保证编译器正确推断方法的返回类型,但instancetype不能做参数
使用id时,本质上是不会作类型检查,对于alloc,init返回类本身类型时还是有用