什么時(shí)候需要使用單例凌外?
整個(gè)應(yīng)用程序共用一份資源,只需要?jiǎng)?chuàng)建一次摄欲。
例如:
1.登錄后用戶的個(gè)人信息使用nsuserdefaults單例管理
2.使用單例訪問應(yīng)用的配置信息
3.轿亮。我注。迟隅。
單例的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):保證這個(gè)類在程序運(yùn)行過程中只有一個(gè)實(shí)例,而且便于外界訪問智袭。
缺點(diǎn):?jiǎn)卫龑?shí)例一旦創(chuàng)建,對(duì)象指針是保存在靜態(tài)區(qū)的,那么在堆區(qū)分配空間只有在應(yīng)用程序終止后才會(huì)被釋放。而且單例不能繼承吼野。
1.最優(yōu)寫法使用GCD
優(yōu)點(diǎn)是dixpatch_once保證了線程安全
.h
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface SingManager : NSObject
//禁止外部調(diào)用
-(instancetype)init NS_UNAVAILABLE;
-(id)copy NS_UNAVAILABLE;
-(id)mutableCopy NS_UNAVAILABLE;
+(instancetype)new NS_UNAVAILABLE;
+(instancetype)sharedSingManager;
@end
NS_ASSUME_NONNULL_END
.m
#import "SingManager.h"
@implementation SingManager
//單例的創(chuàng)建
+ (instancetype)sharedSingManager{
static SingManager *sharedSingManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedSingManager = [[self alloc] init];
});
return sharedSingManager;
}
@end
2.不考慮線程安全
#import "SingManager.h"
static SingManager *sharedSingManager = nil;
@implementation SingManager
//單例的創(chuàng)建
+ (instancetype)sharedSingManager{
if(!sharedSingManager){
sharedSingManager = [[self alloc] init];
}
return sharedSingManager;
}
@end