单例模式:
 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文件):

很明显,极大的精简了单例的写法,提高了代码的复用价值。

具体使用效果:

对象的地址打印:

工作中用到单例,每次重写烦不胜烦。理解了单例的作用和写法,不妨试试这个宏定义,也可以提出修改共同进步

github的下载地址

最新文章

  1. Apache Shiro 使用手册(三)Shiro 授权
  2. java 10-4 Scanner方法
  3. servlet中cookie的使用
  4. 如何从innodb的数据字典里恢复表结构
  5. git和svn的区别001
  6. sql server查询出的结果中添加一列序列行
  7. 【转】win7与VMware ubuntu虚拟机实现文件共享(最后一定要装open-vm-dkms插件)
  8. Hard Life
  9. expdp.sh and impdp.sh
  10. Java web学习 Cookie&&Session
  11. 魔方 NewLife.Cube
  12. C#相关FTP操作
  13. PYTHON-模块 logging hashlib
  14. MySQL 必知必会学习笔记
  15. 作业:JavaScript(数组篇-poker)给我的徒弟出个题。。。记得早点写完,然后大家3人可以早点打牌了
  16. Android : Your APK does not seem to be designed for tablets.
  17. js常用代码整理
  18. 解数独(Python)
  19. thinkphp 漂亮的分页样式
  20. SYN Flood攻击及防御方法 (转)

热门文章

  1. jquery全选,取消全选
  2. C语言细节笔记1
  3. Redis入门教程(三)— Java中操作Redis
  4. mysql 转换编码方式
  5. bzoj 5457 城市
  6. Ural2004: Scientists from Spilkovo(德布鲁因序列&思维)
  7. Hibernate关联映射(多对一 --- many-to-one)
  8. Wait示例分析
  9. bzoj 3624: [Apio2008]免费道路【生成树+贪心】
  10. 文件系统访问控制ACL设置