什麼是單例模式:(Singleton)
單例模式的意圖是是的類的對象成爲系統中唯一的實例,提供一個訪問點,供客戶類 共享資源。
什麼情況下使用單例?
1、類只能有一個實例,而且必須從一個爲人熟知的訪問點對其進行訪問,比如工廠方 法。
2、這個唯一的實例只能通過子類化進行擴展,而且擴展的對象不會破壞客戶端代碼。
單例設計模式的要點:
1) 某個類只能有一個實例。
2)他必須自行創建這個對象
3)必須自行向整個系統提供這個實例;
4)爲了保證實例的唯一性,我們必須將
5)這個方法必須是一個靜態類
下面看代碼實現
Tools.h
#import <Foundation/Foundation.h>
@interface Tools : NSObject<NSCopying, NSMutableCopying>
// 一般情況下創建一個單利對象都有一個與之對應的類方法
// 一般情況下用於創建單利對象的方法名稱都以share開頭, 或者以default開頭
+ (instancetype)shareInstance;
@end
Tools.m
#import "Tools.h"
static Tools *_instance = nil;//不能讓外部訪問,同時放在靜態塊中
@implementation Tools
+ (instancetype)shareInstance
{
if (_instance == nil) {
_instance = [[self alloc] init];
}
return _instance;
}
+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
/*
// 當前代碼在多線程中可能會出現問題
NSLog(@"%s", __func__);
// 由於所有的創建方法都會調用該方法, 所以只需要在該方法中控制當前對象只創建一次即可
if (_instance == nil) {
NSLog(@"創建了一個對象");
_instance = [[super allocWithZone:zone] init];
}
return _instance;
*/
// 以下代碼在多線程中也能保證只執行一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [[super allocWithZone:zone] init];
});
return _instance;
}
// copyWithZone方法用什麼調用? 對象
- (id)copyWithZone:(NSZone *)zone{
return _instance;
}
- (id)mutableCopyWithZone:(NSZone *)zone
{
return _instance;
}
- (oneway void)release
{
// 爲保證整個程序過程中只有一份實例, \
在這個方法中什麼都不做
}
- (instancetype)retain
{
return _instance;
}
- (NSUInteger)retainCount
{
// return 1;
// 注意: 爲了方便程序員之前溝通, 一般情況下不會在單例中返回retainCount = 1
// 而是返回一個比較大得值
return MAXFLOAT;
}
@end