@synchronized 的作用是创建一个互斥锁,保证此时没有其它线程对self对象进行修改。这个是objective-c的一个锁定令牌,防止self对象在同一时间内被其它线程访问,起到线程的保护作用。 一般在公用变量的时候使用,如单例模式或者操作类的static变量中使用。
# import "NetworkManager.h"
static NetworkManager *network = nil;
@implementation NetworkManager
+ (NetworkManager *)getNetworkInstance{
@synchronized(self){
if (nil == network){
network = [[NetworkManager alloc] init];
{
}
return network;
}
dispatch_once
+ (id)sharedInstance
{
static dispatch_once_t pred;
static Instance *obj = nil;
dispatch_once(&pred, ^{
obj = [[Instance alloc] init];
});
return obj;
}
这样的方法有很多优势,首先满足了线程安全问题,其次很好满足静态分析器要求。GCD可以确保以更快的方式完成这些检测,它可以保证block中的代码在任何线程通过dispatch_once调用之前被执行,但它不会强制每次调用这个函数都让代码进行同步控制。实际上,如果你去看这个函数所在的头文件,你会发现目前它的实现其实是一个宏,进行了内联的初始化测试,这意味着通常情况下,你不用付出函数调用的负载代价,并且会有更少的同步控制负载。