1.單例模式的作用
1>可以保證在程序運(yùn)行過(guò)程中,一個(gè)類只有一個(gè)實(shí)例,而且該實(shí)例易于供外界訪問(wèn) (這個(gè)蘋果系統(tǒng)給我們提供很多單例的形式: 如share開頭的類方法, default開頭的類方法等等)
// 文件管理
NSFileManager *manager = [NSFileManager defaultManager];
NSFileManager *manager2 = [NSFileManager defaultManager];
NSFileManager *manager3 = [NSFileManager defaultManager];
NSFileManager *manager4 = [NSFileManager defaultManager];
NSLog(@"\n%@\n%@\n%@\n%@",manager,manager2,manager3,manager4);
// 程序管理
[UIApplication sharedApplication];
// 設(shè)置(偏好設(shè)置)
[NSUserDefaults standardUserDefaults];
控制臺(tái)輸出:
2> 方便的控制實(shí)例個(gè)數(shù), 并且節(jié)約系統(tǒng)資源
2.單例模式的使用場(chǎng)合
1>資源只需要初始化一次,在程序中,共享一份資源
單例模式的創(chuàng)建過(guò)程
1.在ARC中,在.m文件中,保留一個(gè)全局的static的實(shí)例
static id _instance;
2.重寫+ allocWithZone:
此方法在調(diào)用alloc時(shí)必會(huì)調(diào)用. 對(duì)于alloc
方法,相信大家并不是很陌生, alloc方法,的主要作用就是為了給新創(chuàng)建的對(duì)象分配存儲(chǔ)空間用的.
所以在這里創(chuàng)建唯一的實(shí)例(不過(guò)要注意線程安全)[前一段學(xué)習(xí)了 一次性代碼, 將代碼塊放在一次性代碼內(nèi)部,便可以只執(zhí)行一次,也就是只分配了一次性內(nèi)存]
- 有人會(huì)說(shuō),懶加載也可以,但是懶加載會(huì)造成資源搶奪的問(wèn)題,為了解決這個(gè)問(wèn)題,可以添加互斥鎖,用來(lái)解決.
// 重寫allocWithZone方法,
+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
// 執(zhí)行一次性代碼
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if (_instance == nil) {
NSLog(@"我愛(ài)你");
_instance = [super allocWithZone:zone];
}
});
// 創(chuàng)建實(shí)例
return _instance;
}
- 提供1個(gè)類方法讓外界訪問(wèn)唯一的實(shí)例
+ shareInstance
[方法名必須有意義,見(jiàn)名知意]
// 自定義單例方法
+ (instancetype)shareInstance
{
return [[self alloc]init];
}
- 對(duì)于單例,應(yīng)該無(wú)論以何種方式創(chuàng)建都應(yīng)該只有一份內(nèi)存的, 對(duì)于ARC的創(chuàng)建的方法還有
copy``mutableCopy
,但必須遵守協(xié)議<NSCopying,NSMutableCopying> , 執(zhí)行copy,MutableCopy的時(shí)候必定會(huì)執(zhí)行copyWithZone``mutableCopyWithZone
- (id)copyWithZone:(struct _NSZone *)zone
{
return _instance;
}
- (id)mutableCopyWithZone:(NSZone *)zone
{
return _instance;
}
MRC創(chuàng)建單例,和ARC基本相同, 只不過(guò)ARC是自動(dòng)引用計(jì)數(shù)器, 會(huì)自動(dòng)釋放.MRC必須手動(dòng)釋放內(nèi)存
1.多了一個(gè)new的類方法創(chuàng)建方法:
// 創(chuàng)建方法:new
+ (instancetype)new
{
return [[self alloc]init];
}
2.多了一個(gè)retain的對(duì)象方法創(chuàng)建方法:
- (instancetype)retain
{
return _instance;
}
- 分配一份內(nèi)存珍手,永遠(yuǎn)不要被release
- (oneway void)release
{
}
- 專業(yè)一點(diǎn)祈坠,讓其返回最大計(jì)數(shù),讓人一看就知道是單例
- (NSUInteger)retainCount
{
return MAXFLOAT;
}
5.對(duì)象銷毀的時(shí)候,必須調(diào)用dealloc
- (void)dealloc
{
[super dealloc];
NSLog(@"被銷毀了");
}