//第一种;(单线程) + (id)sharePen{ static Pen *pen = nil; if (pen == nil) { pen = [[Pen alloc] init]; } return pen; } //第二种; + (id)sharePen{ static Pen *pen = nil; @synchronized(self) { if (pen == nil) { pen = [[Pen alloc] init]; } } return pen; } //第3种;(和第二种的区别在于有提示) + (id)sharePen{ static Pen *pen = nil; //保证里面的方法只执行一次 static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ pen = [[Pen alloc] init]; }); return pen; }