單例,確保程序運行中該類只有一個實例,常用于資源共享。例如:[UIApplication sharedApplication];
OC寫法:
#import <Foundation/Foundation.h>
@interface Review_SingleInstance : NSObject
+(Review_SingleInstance *)shareInstance;
@end
#import "Review_SingleInstance.h"
@implementation Review_SingleInstance
static Review_SingleInstance *_instance = nil;
+(Review_SingleInstance *)shareInstance{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [[[self class] alloc] init];
});
return _instance;
}
//為了防止使用alloc、new重復創建對象,需要添加下面方法
+(instancetype)allocWithZone:(struct _NSZone *)zone{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [super allocWithZone:zone];
});
return _instance;
}
調用:
Review_SingleInstance *instance1 = [Review_SingleInstance shareInstance];
NSLog(@"%@",instance1);
Swift寫法:
import UIKit
class RISDesignPattern:NSObject{
// MARK: - 單例
static let instance : RISDesignPattern = RISDesignPattern()
private override init() {
}
}
調用:
// MARK: - 實例化設計模式 - 單例
let designPattern = RISDesignPattern.instance
關于單例類屬性的問題
單例類中屬性賦值 - 需要創建獲取空間的屬性,要放在shareInstance中,才不會重復創建,因為init方法會被重新執行