每個app有且僅有一個UIApplication,相似UIApplication「 [UIApplication sharedApplication]」這種一個類有且僅有惟一實例的設計即單例模式。
安全
一個單例類設計以下圖所示app
其中有幾點要注意:spa
(1)實例須要用static,防止在其餘文件中被修改;線程
(2)鑑於開發習慣,因此類方法都是以「sharedXXX"命名,並在其中進行惟一一次實例化;設計
(3)alloc時會調用allocWithZone方法,爲了保持單例,須要重寫該方法;3d
(4)檢查兩次實例是否爲nil是有不一樣含義的,第一次檢查實例是否爲nil也就是常說的雙重檢查鎖,避免重複加鎖。由於當第一次實例化後,後續每次獲取實例時沒有必要進行加鎖等操做,直接返回實例便可,第二次檢查實例是否爲nil很明顯就是爲了保證明例惟一了。對象
(5)加鎖@synchronized的意義在於保證線程安全,避免_instance爲nil時恰好多個線程同時獲取實例,因而同時產生了多個實例。經過加鎖來保證同一時刻只能有一個線程進行調用,確保單例;blog
(6)爲了防止copy時產生新的實例,一樣對copyWithZone進行了從新,保證單例作用域
GCD方式單例設計以下圖所示開發
static修飾全局變量的做用在於限制其做用域,使變量只在定義的源文件內有效。
反之,若是咱們去掉static的修飾,就能夠在外部其餘文件進行引用並修改變量,也就破壞單例了。
若是是在MRC環境下使用單例,除了上述設計外還要進行一些重寫,使對象引用計數永遠爲1