Objective-C中的單例模式

青玉伏案發表於2015-12-17

單例模式算是設計模式中比較簡單的一種吧,設計模式不是隻針對某種程式語言,在C++, Java, PHP等其他OOP語言也有設計模式,筆者初接觸設計模式是通過《漫談設計模式》瞭解的。這本書中是用java寫的,個人感覺拜讀完這本書以後雖然有不理解的地方但還是收穫蠻大的。上面提到依賴注入,控制翻轉的時候,沒大看懂,當學習到Strut,Spring, Hibernate的東西的時候才略懂略懂。不過在23種設計模式裡面單例模式還是算比較好理解的, 那麼在OC中又是怎麼來表示單例模式的呢?下面會結合著lusashi的程式碼,理解一下OC中得單例模式。

首先得了解什麼是單例模式,用大白話說,單例模式就是在程式中這個類只對應著一個例項,這就是單例模式,單例模式一般用全域性靜態物件來實現。下面我們會建立一個生成單例的類SingletonClass,在實現檔案中定義各種方法來實現我們的單例模式。

1.單例模式一般用全域性靜態物件來實現,所以我們在SingletonClass.m中定義一個靜態全域性變數是少不了的

​2.上面的靜態變數是定義在實現檔案中的所以是私有的,要想獲取該類的例項得有個getInstance方法來獲取例項,在給靜態變數分配記憶體空間之前首先要判斷是否已經分配過啦,確保單例,如果分配過了就不分配了。

  ​
​3.為了防止使用者通過alloc和new來例項化物件,因此我們要對類方法allcoWithZone進行重寫

​4.為了防止使用者把單例進行深淺拷貝,我們需要重寫copyWithZone方法和mutableCopyWithZone方法,在重寫方法之前我們的單例類必須遵循協議NSCoping和NSMutableCoping協議

​    ​遵循協議程式碼如下:

​    ​重寫copyWithZone方法

​    ​重寫mutableCopyWithZone方法

​5.防止使用者把建立的單例dealloc,我們需要重寫retainCount方法

​6. 重寫release,autorelease, retain方法

​至此我們的單例模式基本建立完畢,下面開始我們的測試吧;

​在main函式中的程式碼如下:

​    ​執行結果如下:

​    ​    ​單例的地址是不變的。

上面是在非ARC模式下得單例模式,那麼在ARC模式下我們應如何實現我們的單例模式呢,我們下面就會給出ARC下的單例模式,用下面的方法,因沒有重寫alloc,copy等方法,通過alloc還是可以給該物件分配一個新物件的,上面是執行緒不安全的,下面是執行緒安全的:

打賞支援我寫出更多好文章,謝謝!

打賞作者

打賞支援我寫出更多好文章,謝謝!

Objective-C中的單例模式

相關文章