單例--只寫一次就夠了

weixin_33912246發表於2017-04-19

單例簡介

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類名方法即可。

相關文章