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返回类本身类型时还是有用
本文介绍了dispatch_once函数的应用及单例模式的实现方法。通过示例代码详细展示了如何使用dispatch_once确保代码块仅被执行一次,并结合单例模式保证类的唯一实例。此外,还对比了id与instancetype作为返回类型的区别。

被折叠的 条评论
为什么被折叠?



