iOS單例繼承

2021-09-12 15:41:14 字數 3195 閱讀 7903

一般來說,在ios的工程中, 通用的tool一般都會設計成單例,這樣能保證在程式執行過程中,程式中只有乙個單例物件,方便資料的傳輸和處理。

如果為了擴充套件此單例類,希望在此基礎上增加面向各模組專用的單例方法,該如何處理呢。

可以採用的方法有兩種:

因為單例物件在程式中只會建立一次,建立成功後再次訪問單例物件,訪問的是同乙個物件,故子類如果採用父類的方法進行建立的話,訪問的物件還是父類,子類新增的屬性和方法將會無法訪問而造成crash。

// 父類

qysingleton *singleton = [qysingleton sharesingleton];

nslog(@"%@ - %p", singleton, singleton);

// 方法

[singleton run];

列印結果

單例繼承[3651:162046] name: father, age: 30, ***: male - 0x604000221da0

單例繼承[3711:165295] qysingleton run

// 子類

// 子類:採用繼承的父類的類方法進行建立

qysubsingleton *subsingleton = [qysubsingleton sharesingleton];

nslog(@"%@ - %p", subsingleton, subsingleton);

列印結果

name: father, age: 30, ***: male - 0x604000221da0
由以上結果可知,這兩個物件的位址是一樣的,也證明了程式中只會建立乙份單例物件。

// 父類

qysingleton *singleton = [qysingleton sharesingleton];

nslog(@"%@ - %p", singleton, singleton);

// 方法

[singleton run];

// 列印結果

單例繼承[6181:308541] name: father, age: 30, ***: male - 0x6040000349e0

單例繼承[6220:310333] qysingleton run

// 通過alloc、init進行建立

qysubsingleton *subsingleton = [[qysubsingleton alloc] init];

// 繼承的屬性

subsingleton.name = @"subobject";

// 子類新增的屬性

subsingleton.hobby = @"游泳";

nslog(@"%@ - %p", subsingleton, subsingleton);

// 繼承的方法

[subsingleton run];

// 新增的方法

[subsingleton walk];

// 列印的結果

單例繼承[6220:310333] name: subobject, age: 30, ***: male, hobby:游泳 - 0x60000025ad90

// 呼叫父類的方法

單例繼承[6220:310333] qysubsingleton run

// 子類新增的方法

單例繼承[6220:310333] qysubsingleton walk

由列印可知,這樣才能建立出新的子類物件,並且可以更改父類的初始屬性,新增新的屬性和方法

以上建立單例和單例的子類都不是很嚴謹,父類通過sharesingleton建立的物件,和通過alloc、init建立的物件是不一樣的。

這是因為,oc通過allocwithzone:這個方法來申請記憶體的,故我們要覆寫這個方法,保證建立出來的物件是唯一的。

+ (instancetype)allocwithzone:(struct _nszone *)zone
修改sharesingleton為:

+ (instancetype)sharesingleton );

return singleton;

}

這樣就不管是使用什麼方法,建立出來的物件就都是唯一的了。

因為單例具有唯一性,要保證每個建立的類是不同的,所以在每個類生成時,我們動態的給類繫結唯一的物件。

使用runtime的關聯物件進行建立。

如下:

/** 單例物件 */

+ (instancetype)shareobject

return instance;

}/** 保證alloc、init也建立同樣的物件 */

+ (instancetype)allocwithzone:(struct _nszone *)zone

驗證:

qyobject *objc = [qyobject shareobject];

nslog(@"%p", objc);

qyobject *objc2 = [[qyobject alloc] init];

nslog(@"%p", objc2);

qysubobject *subobjc = [qysubobject shareobject];

nslog(@"%p", subobjc);

qysubobject *subobjc2 = [[qysubobject alloc] init];

nslog(@"%p", subobjc2);

結果:

2018-09-12 09:43:22.764627+0800 單例繼承[1639:49824] 0x6040000030d0

2018-09-12 09:43:22.764815+0800 單例繼承[1639:49824] 0x6040000030d0

2018-09-12 09:43:22.764953+0800 單例繼承[1639:49824] 0x604000002d90

2018-09-12 09:43:22.765140+0800 單例繼承[1639:49824] 0x604000002d90

python單例模式繼承 python單例模式

我們可以使用 new 這個特殊方法。該方法可以建立乙個其所在類的子類的物件。更可喜的是,我們的內建 object 基類實現了 new 方法,所以我們只需讓 sing 類繼承 object 類,就可以利用 object 的 new 方法來建立 sing 物件了。classsing object def...

IOS 單例模式

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

iOS 單例模式

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