單例模式的作用:可以保證在程式執行過程,乙個類只有乙個例項,而且該例項易於供外界訪問,從而方便地控制了例項個數,並節約系統資源。
單例模式的使用場合: 在整個應用程式中,共享乙份資源(這份資源只需要建立初始化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...