1.加互斥锁的单例(因为在多线程的情况下,不枷锁的情况线程是不安全的) + (instancetype)shaerdNetTool; // 实现 + (instancetype)shaerdNetTool{ static NetToll *tool = nil; @synchronized(self) { if (tool == nil) { tool = [NetToll new]; } } return tool; }
2.通过GCD的一次执行 (一次执行线程是安全的,整个运行过程只执行一次) // 声明 + (instancetype)shaerdNetTooOncel; // 实现 + (instancetype)shaerdNetToolOnce{ static NetToll *tool = nil; if (tool == nil) { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ tool = [NetToll new]; }); } return tool; }
比较效率 CFAbsoluteTime time1 = CFAbsoluteTimeGetCurrent(); for (int i =0; i<100000; i++) { [NetToll shaerdNetToolOnce]; } NSLog(@"%f",CFAbsoluteTimeGetCurrent()-time1); CFAbsoluteTime time2 = CFAbsoluteTimeGetCurrent(); for (int i =0; i<100000; i++) { [NetToll shaerdNetTool]; } NSLog(@"%f",CFAbsoluteTimeGetCurrent()-time2);