完美单例宏定义(兼容ARC和MRC),项目中可以直接使用
2024-08-30 19:50:15
单例模式:
1.永远只分配一块内存来创建对象
2.提供一个类方法, 返回内部唯一的一个对象(一个实例)
3.最好保证init方法也只初始化一次
写一个宏定义文件,传入宏定义函数名,自动生成符合类名的单例函数名:
ARC下单例的常规写法(代码中的\是宏定义的写法):
static id _instance;
+ (id)allocWithZone:(struct _NSZone *)zone
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [super allocWithZone:zone];
});
return _instance;
} + (instancetype)shared##name
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [[self alloc] init];
});
return _instance;
}
+ (id)copyWithZone:(struct _NSZone *)zone
{
return _instance;
}
MRC写法:
static id _instance; \
+ (id)allocWithZone:(struct _NSZone *)zone \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instance = [super allocWithZone:zone]; \
}); \
return _instance; \
} \
\
+ (instancetype)shared##name \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instance = [[self alloc] init]; \
}); \
return _instance; \
} \
\
- (oneway void)release \
{ \
\
} \
\
- (id)autorelease \
{ \
return _instance; \
} \
\
- (id)retain \
{ \
return _instance; \
} \
\
- (NSUInteger)retainCount \
{ \
return ; \
} \
\
+ (id)copyWithZone:(struct _NSZone *)zone \
{ \
return _instance; \
}
宏在单例类中的用法(.h文件):
宏在单例类中的用法(.m文件):
很明显,极大的精简了单例的写法,提高了代码的复用价值。
具体使用效果:
对象的地址打印:
工作中用到单例,每次重写烦不胜烦。理解了单例的作用和写法,不妨试试这个宏定义,也可以提出修改共同进步
最新文章
- Apache Shiro 使用手册(三)Shiro 授权
- java 10-4 Scanner方法
- servlet中cookie的使用
- 如何从innodb的数据字典里恢复表结构
- git和svn的区别001
- sql server查询出的结果中添加一列序列行
- 【转】win7与VMware ubuntu虚拟机实现文件共享(最后一定要装open-vm-dkms插件)
- Hard Life
- expdp.sh and impdp.sh
- Java web学习 Cookie&;&;Session
- 魔方 NewLife.Cube
- C#相关FTP操作
- PYTHON-模块 logging hashlib
- MySQL 必知必会学习笔记
- 作业:JavaScript(数组篇-poker)给我的徒弟出个题。。。记得早点写完,然后大家3人可以早点打牌了
- Android : Your APK does not seem to be designed for tablets.
- js常用代码整理
- 解数独(Python)
- thinkphp 漂亮的分页样式
- SYN Flood攻击及防御方法 (转)