iOS 單例模式

2021-07-14 10:48:49 字數 2550 閱讀 8097

單例類要保證乙個類在整個應用程式只能例項化一次,並且所有使用該類的地方都是使用的同乙個例項!

在應用程式中對user封裝成單例

可以理解為通過我們特定的方法獲取的物件才是單例物件。但是通過其他方式獲得物件就不是單例物件了

第一步:為單例物件實現乙個靜態例項,並初始化值為nil

第二步:檢查靜態例項是否為nil,是則新建並返回乙個例項

第三步:重寫allocwithzone方法,用來保證其他人直接使用alloc和init試圖獲得乙個新例項的時候不會產生乙個新例項,

第四步:適當實現copywithzone,retain,retaincount,release和autorelease 等方法

#import @inte***ce singleton : nsobject

+ (instancetype)sharedinstance;

@end

#import "singleton.h"

@implementation singleton

// 因為例項是全域性的 因此要定義為全域性變數,且需要儲存在靜態區,不釋放。不能儲存在棧區。

可以看到,當我們呼叫shareinstance方法時獲取到的物件是相同的,但是當我們通過alloc和init來構造物件的時候,得到的物件卻是不一樣的。

那麼問題就來了,我們通過不同的途徑得到不同的物件,顯然是不行的。我們必須要確保物件的唯一性,所以我們就需要封鎖使用者通過alloc和init以及copy來構造物件這條道路。我們知道,建立物件的步驟分為申請記憶體(alloc)、初始化(init)這兩個步驟,我們要確保物件的唯一性,因此在第一步這個階段我們就要攔截它。當我們呼叫alloc方法時,oc內部會呼叫allocwithzone這個方法來申請記憶體,我們覆寫這個方法,然後在這個方法中呼叫shareinstance方法返回單例物件,這樣就可以達到我們的目的。拷貝物件也是同樣的原理,覆寫copywithzone方法,然後在這個方法中呼叫shareinstance方法返回單例物件。

#import "singleton.h"

@implementation singleton

static singleton* _instance = nil;

+ (instancetype)sharedinstance );

return _instance;

}// 傳送alloc訊息時呼叫

+ (id)allocwithzone:(struct _nszone *)zone );

return _instance;

}// 當呼叫copy的時候,往往已經例項化了乙個變數。這時候_instance是存在的。所以直接返回即可。

對於以上實現模式在arc模式下可正常工作,如果在mrc模式下還不夠完善,當呼叫retain的時候就不能再給引用計數器加1了,當呼叫release方法時就不能引用計數器減1了,再arc下還需要增加如下**

// mrc模式

- (oneway void)release

- (id)retain

- (nsuinteger)retaincount

- (id)autorelease

#import "singleton.h"

@implementation singleton

static id _instance;

+ (instancetype)sharedinstance }}

return _instance;

}/**

* alloc方法內部會呼叫這個方法

*/+ (id)allocwithzone:(struct _nszone *)zone }}

return _instance;

}// 當呼叫copy的時候,往往已經例項化了乙個變數。這時候_instance是存在的。所以直接返回即可。

- (id)copywithzone:(nszone *)zone

@end

IOS 單例模式

單例模式顧名思義就是只有乙個例項,它確保乙個類只有乙個例項,並且自行例項化並向整個系統提供這個例項。它經常用來做應用程式級別的共享資源控制。這個模式使用頻率非常高,通過乙個單例類,可以實現在不同視窗之間傳遞資料。在objective c中要實現乙個單例類,至少需要做以下四個步驟 1 為單例物件實現乙...

iOS 單例模式

最近在ios開發中,需要用到單例模式,於是自己動手寫了乙個,它看起來是這樣的 1 id sharedinstance return sharedinstance 後來發現許多書上的做法都使用到了bool變數作為標值位,它看起來是這樣的 2 id sharedinstance return share...

iOS 單例模式

在objective c中要實現乙個單例類,至少需要做以下四個步驟 1 為單例物件實現乙個靜態例項,並初始化,然後設定成nil,2 實現乙個例項構造方法檢查上面宣告的靜態例項是否為nil,如果是則新建並返回乙個本類的例項,3 重寫allocwithzone方法,用來保證其他人直接使用alloc和in...