單例--只寫一次就夠了
單例簡介
1、可以確保程式在執行過程中,一個類只有一個例項,而且該例項易於提供外接訪問從而方便的控制了例項的個數,節約資源
2、在整個應用程式中,共享一份資源,一般用於工具類
3、優缺點:
優點:對需要的物件只建立一次,節約資源
缺點:a. 單例物件指標存放在靜態區的,單例物件在堆中分配的記憶體空間,會在應用程式終止後才會被釋放。
b.單例類無法繼承,因此很難進行類擴充套件
c.單例不適用於變化的物件
實現
#import "KCShareInstance.h"
static KCShareInstance * shareInstance = nil;
@implementation KCShareInstance
//在該方法中初始化要儲存的物件
- (instancetype)init
{
if (self = [super init]) {
}
return self;
}
//初始化單例物件
+ (instancetype)shareInstance
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
shareInstance = [[[self class] alloc] init];
});
return shareInstance;
}
//保證單例只分配一個記憶體地址
+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
shareInstance = [super allocWithZone:zone];
});
return shareInstance;
}
在pch檔案中初始化單例
#define singleH(name) +(instancetype)share##name;
#if __has_feature(objc_arc)
#define singleM(name) static id _instance;\
+(instancetype)allocWithZone:(struct _NSZone *)zone\
{\
static dispatch_once_t onceToken;\
dispatch_once(&onceToken, ^{\
_instance = [super allocWithZone:zone];\
});\
return _instance;\
}\
\
+(instancetype)share##name\
{\
return [[self alloc]init];\
}\
-(id)copyWithZone:(NSZone *)zone\
{\
return _instance;\
}\
\
-(id)mutableCopyWithZone:(NSZone *)zone\
{\
return _instance;\
}
#else
#define singleM static id _instance;\
+(instancetype)allocWithZone:(struct _NSZone *)zone\
{\
static dispatch_once_t onceToken;\
dispatch_once(&onceToken, ^{\
_instance = [super allocWithZone:zone];\
});\
return _instance;\
}\
\
+(instancetype)shareTools\
{\
return [[self alloc]init];\
}\
-(id)copyWithZone:(NSZone *)zone\
{\
return _instance;\
}\
-(id)mutableCopyWithZone:(NSZone *)zone\
{\
return _instance;\
}\
-(oneway void)release\
{\
}\
\
-(instancetype)retain\
{\
return _instance;\
}\
\
-(NSUInteger)retainCount\
{\
return MAXFLOAT;\
}
#endif
這時我們就可以在任何專案中,當我們要使用單例類的時候只要在專案中匯入PCH檔案然後
在.h檔案中呼叫singleH(類名)
在.m檔案中呼叫singleM(類名)
建立類時直接呼叫share類名方法即可。
相關文章
- iOS – 單例模式寫一次就夠了iOS單例模式
- Android 單元測試只看這一篇就夠了Android
- python 操作 mysql 只看這篇就夠了PythonMySql
- 分散式事務,只看這一篇就夠了分散式
- RxJava2 只看這一篇文章就夠了RxJava
- 關於郵件傳送,只看這一篇就夠了!!!
- Android Architecture Components 只看這一篇就夠了Android
- 關於Scrum敏捷開發,只看這一篇就夠了!Scrum敏捷
- TCP 看我就夠了TCP
- 手寫Promise看著一篇就足夠了Promise
- Java多執行緒超級詳解(只看這篇就夠了)Java執行緒
- Web 前端單元測試到底要怎麼寫?看這一篇就夠了Web前端
- 學Redis這篇就夠了Redis
- mongoDB看這篇就夠了MongoDB
- 面試時寫不出排序演算法?看這篇就夠了。面試排序演算法
- 面試時寫不出排序演算法?看這篇就夠了面試排序演算法
- 只會用就out了,手寫一個符合規範的PromisePromise
- 跨域了? 裝個外掛就夠了!跨域
- Django orm基本crud方法大全!!所有操作只看一篇文章就夠了!!DjangoORM
- SpringBoot寫後端介面,看這一篇就夠了!Spring Boot後端
- Ajax原理一篇就夠了
- HTML教程(看完這篇就夠了)HTML
- 想熟悉PostgreSQL?這篇就夠了SQL
- springmvc知道這些就夠了SpringMVC
- Oracle索引,看這篇就夠了Oracle索引
- spring 掌握這些就夠了Spring
- SVN、GIT日常看我就夠了Git
- Objective-C copy,看我就夠了Object
- Ubuntu搭建Pytorch,就這一篇就夠了UbuntuPyTorch
- 面試大廠,手寫程式碼這些就夠了,附 codepen 地址!面試
- Zookeeper入門一篇就夠了
- 面試題:Vue(最新,有我就夠了...)面試題Vue
- MySQL事務,這篇文章就夠了MySql
- 入門Webpack,看這篇就夠了Web
- APP瘦身這一篇就夠了APP
- Android Fragment看這篇就夠了AndroidFragment
- HttpServletRequest,看這篇文章就夠了HTTPServlet
- OAuth授權|看這篇就夠了OAuth