1. 关于 dispatch_once
dispatch_once
Executes a block object once and only once for the lifetime of an application.
在stackoverflow上有个对dispatch_once的解释,非常棒:
What's the exact reason for using dispatch_once in the shared instance accessor of a singleton under ARC?
+(MyClass*)sharedInstance { // Static local predicate must be initialized to 0 staticMyClass*sharedInstance = nil; staticdispatch_once_t onceToken =0; dispatch_once(&onceToken,^{ sharedInstance =[[MyClass alloc] init]; // Do any other initialisation stuff here }); return sharedInstance; }
dispatch_once()
is absolutely synchronous. Not all GCD methods do things asynchronously (case in point, dispatch_sync()
is synchronous). The use of dispatch_once()
replaces the following idiom:
+(MyClass*)sharedInstance { staticMyClass*sharedInstance; @synchronized(self) { if(sharedInstance == nil) { sharedInstance =[[MyClass alloc] init]; } } return sharedInstance; }
The benefit of dispatch_once()
over this is that it's faster. It's also semantically cleaner, because the entire idea of dispatch_once()
is "perform something once and only once", which is precisely what we're doing.