1、典型的单例写法
1 static id sharedMyManager; 2 +(id)shareThemeManager{ 3 if(sharedThemeManager == nil){ 4 shareMyManager = [[self alloc]init]; 5 } 6 return sharedMyManager; 7 }
缺点:无法保证多线程情况下只创建一个对象。适用于只有单线程。
2、加锁的写法:
1 static sharedManager* single = nil; 2 3 +(sharedManage*)sharedManage{ 4 5 @synchronized(self){ //加锁,保证多线程下也只能有一个线程进入 6 7 if (!single) { 8 9 single = [[self alloc]init]; 10 11 } 12 13 } 14 15 return single; 16 17 }
这种方法较常用。
3、GCD写法:
static sharedManager * single = nil;
+(id)sharedManager{ static dispatch_once_t once; dispatch_once(&once,^{
single = [[self alloc]init];
});
return single;
}
4、免锁(Lock free)的写法:
1 static sharedManager * single = nil; 2 3 +(void)initialize{ 4 5 static BOOL initialized = NO; 6 7 if (initialized == NO){ 8 9 initialized = YES; 10 11 shareMyManager = [[self alloc]init]; 12 13 } 14 15 }
单例全面的写法:
重载以下方法:
+(id)allocWithZone:(NSZone *)zone;
+(id)copyWithZone:(NSzone *)zone;
+(id)retain;
+(void)release; //单例里面重写单例不允许release,autorrelease,所以重写
+(void)autorelease;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】