天天看點

IOS 單例設計模式解讀

      顧名思義,單例,即是在整個項目中,這個類的對象隻能被初始化一次。它的這種特性,可以廣泛應用于某些需要全局共享的資源中,比如管理類,引擎類,也可以通過單例來實作傳值。uiapplication、nsuserdefaults等都是ios中的系統單例。

       單例的寫法常用的有兩種方式:

<a href="http://my.oschina.net/u/2340880/blog/402759#">?</a>

1

2

3

4

5

6

7

8

<code>static</code> <code>singlecase *manager = nil;  </code>

<code>   </code> 

<code>+ (singlecase *)defaultmanager {  </code>

<code>    </code><code>if</code> <code>(!manager){ </code>

<code>        </code><code>singlecase = [[self alloc] init];  </code>

<code>        </code><code>return</code> <code>manager; </code>

<code>        </code><code>}</code>

<code>}</code>

9

<code>+ (singlecase *)sharedmanager  </code>

<code>{  </code>

<code>        </code><code>static</code> <code>singlecase *managerinstance = nil;  </code>

<code>        </code><code>static</code> <code>dispatch_once_t predicate;  </code>

<code>        </code><code>dispatch_once(&amp;predicate, ^{  </code>

<code>                </code><code>managerinstance = [[self alloc] init];   </code>

<code>        </code><code>});  </code>

<code>    </code><code>return</code> <code>managerinstance;  </code>

        通過上面的方法,我們已經可以使用類方法來得到這個單例,但很多時候,項目的工程量很大,還有可能會很多開發者同時參與一個項目的開發,為了安全與管理代碼的友善,也為了給不是這個單例的創作者但會用到這個單例的開發人員一些提示,我們通常會重寫一些方法:

首先我們自己實作一個alloc方法:

<code>+(instancetype)myalloc{</code>

<code>    </code><code>return</code> <code>[super allocwithzone:nil];</code>

将我們的單例實作方法略作修改:

<code>+(zyhpaymanager *)sharedmamager{</code>

<code>    </code><code>static</code> <code>zyhpaymanager * manager;</code>

<code>    </code><code>if</code> <code>(manager==nil) {</code>

<code>        </code><code>manager=[[zyhpaymanager myalloc]init];</code>

<code>    </code><code>}</code>

<code>    </code><code>return</code> <code>manager;</code>

将一些視圖執行個體化對象的方法重寫:

10

11

12

13

14

<code>+(instancetype)alloc{</code>

<code>    </code><code>nsassert(0, @</code><code>"這是一個單例對象,請使用+(zyhpaymanager *)sharedmamager方法"</code><code>);</code>

<code>    </code><code>return</code> <code>nil;</code>

<code>+(instancetype)allocwithzone:(</code><code>struct</code> <code>_nszone *)zone{</code>

<code>    </code><code>return</code> <code>[self alloc];</code>

<code>-(id)copy{</code>

<code>    </code><code>nslog(@</code><code>"這是一個單例對象,copy将不起任何作用"</code><code>);</code>

<code>    </code><code>return</code> <code>self;</code>

<code>+(instancetype)</code><code>new</code><code>{</code>

<code>    </code><code>return</code>  <code>[self alloc];</code>

注意:這裡的alloc使用了斷言,讓任何視圖通過alloc建立對象的程式段斷在此處,給程式員提示。copy方法這裡隻是簡單的傳回了原對象,并未做任何處理,列印資訊給程式員提示。

繼續閱讀