一般來說,在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...