iOS開發實踐之多執行緒 單例模式

2021-12-29 22:39:00 字數 4495 閱讀 7427

單例模式的作用:可以保證在程式執行過程,乙個類只有乙個例項,而且該例項易於供外界訪問,從而方便地控制了例項個數,並節約系統資源。

單例模式的使用場合: 在整個應用程式中,共享乙份資源(這份資源只需要建立初始化1次)。

1、在.m中保留乙個全域性的static的例項(static 防止其它類extern引用 修改值)

static id _instance;

2、重寫allocwithzone:方法,在這裡建立唯一的例項(注意執行緒安全)

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

return _instance;

}3、提供1個類方法讓外界訪問唯一的例項

+ (instancetype)sharedmusictool }}

return _instance;

}4、實現copywithzone:方法

- (id)copywithzone:(struct _nszone *)zone

5、如果要實現餓漢式的單例,就實現load方法。(建議不使用)

//當類載入到oc執行時環境中(記憶體),就會呼叫一次(乙個類只會載入1次)

+(void)load

**單例工具類例子**:

musictool.h

#import

@inte***ce musictool : uiview

//提供1個類方法讓外界訪問唯一的例項

+(instancetype)sharedmusictool;

@end

musictool.m

#import "musictool.h"

//單例模式:懶漢式

@implementation musictool

static id _instance; //static 防止其它類extern引用 修改值

/** * 如果要實現餓漢式的單例,就實現load方法

* 當類載入到oc執行時環境中(記憶體),就會呼叫一次(乙個類只會載入1次)

*///+(void)load

//當第一次使用這個類的時候才會呼叫

//+(void)initialize

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

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

return _instance;

}/**

* 例項化類

*/+(instancetype)sharedmusictool}}

return _instance;

}/**

* 重寫copy方法,保證copy出來的也是單例類

*/-(id)copywithzone:(nszone *)zone

@end

非arc中(mrc),單例模式的實現(比arc多了幾個步驟)

實現記憶體管理方法

- (id)retain

- (nsuinteger)retaincount

- (oneway void)release {}

- (id)autorelease

musictool.m

#import "musictool.h"

@implementation musictool

static id _instance; //static 防止其它類extern引用 修改值

/** * 如果要實現餓漢式的單例,就實現load方法

* 當類載入到oc執行時環境中(記憶體),就會呼叫一次(乙個類只會載入1次)

*///+(void)load

//當第一次使用這個類的時候才會呼叫

//+(void)initialize

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

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

return _instance;

}/**

* 例項化類

*/+(instancetype)sharedmusictool}}

return _instance;

}/**

* 重寫copy方法,保證copy出來的也是單例類

*/-(id)copywithzone:(nszone *)zone

//重寫release方法,不釋放

-(oneway void)release

//重寫retain方法,返回單例類

-(instancetype)retain

//計算永遠為1

-(nsuinteger)retaincount

@end

測試:musictool *mt1 = [[musictool alloc] init];

musictool *mt2 = [musictool sharedmusictool];

musictool *mt3 = [mt2 copy];

[mt2 release];//非arc環境下release

把單例定義成巨集,抽出公共類

1、hmsingleton.h

// .**件

#define hmsingletonh(name) + (instancetype)shared##name;

// .m檔案

#if __has_feature(objc_arc)

#define hmsingletonm(name) \

static id _instace; \

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

); \

return _instace; \

} \\ + (instancetype)shared##name \

); \

return _instace; \

} \\ - (id)copywithzone:(nszone *)zone \

#else

#define hmsingletonm(name) \

static id _instace; \

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

); \

return _instace; \

} \\ + (instancetype)shared##name \

); \

return _instace; \

} \\ - (id)copywithzone:(nszone *)zone \

\\ - (oneway void)release \

- (id)retain \

- (nsuinteger)retaincount \

- (id)autorelease

#endif

2、要想再整個專案中都能使用這個巨集,則要在預編譯pc**件中import匯入這個標頭檔案

#ifdef __objc__

#import

#import

#import "hmsingleton.h"

#endif

3、使用hmsingleton工具類,實現hmmusictool單例

hmmusictool.h

#import

@inte***ce hmmusictool : nsobject

//巨集定義的方法

hmsingletonh(musictool)

@end

hmmusictool.m

#import "hmmusictool.h"

@implementation hmmusictool

//巨集定義的方法

hmsingletonm(musictool)

@end

4.測試:

IOS開發之多執行緒NSThread

一 什麼是多執行緒 nsthread是輕量級的多執行緒開發,使用並不複雜,但使用nsthread需要自己管理執行緒的生命週期,這篇文章主要講nsthread的使用 了解程序與執行緒 1.執行緒是cpu執行任務的基本單位,乙個程序能有多個執行緒,但同時只能執行乙個任務 2.程序就是執行中的軟體,是動態...

多執行緒 單例模式

單例模式 是非常典型常用的一種設計模式 乙份資源只能被申 載一次 單例模式的方法建立的類在當前程序中只有乙個例項 資源的程式初始化的時候就去載入,後面使用的時候直接使用,使用的時候比較流暢,有可能會載入用不上的資源,導致程式初始化時間比較慢。include class single instance...

單例模式多執行緒

單例模式 確保某個類只有乙個例項化物件 import time class a from threading import lock instance none lock lock def new cls,args,kwargs 加鎖確保時間片不發生輪轉 with cls.lock ifnot cl...