[关闭]
@chenbinghua 2015-09-12T10:33:38.000000Z 字数 1809 阅读 1420

iOS开发之单例模式

iOS笔记


单例模式实现步骤

重写allocWithZone:方法,因为alloc内部调用allocWithZone:方法。这样类用alloc init或new创建的对象都是单例对象。

  1. @implementation Person
  2. static Person *_person; // 强指针,对象永远不死
  3. // alloc内部调用allocWithZone:方法
  4. + (instancetype)allocWithZone:(struct _NSZone *)zone
  5. {
  6. // 使用GCD的一次性代码
  7. static dispatch_once_t onceToken;
  8. dispatch_once(&onceToken, ^{
  9. _person = [super allocWithZone:zone];
  10. });
  11. return _person;
  12. }

提供类方法创建单例对象

如[Person sharedPerson]

  1. // .m文件增加此方法 .h文件添加此方法声明
  2. + (instancetype)sharedPerson
  3. {
  4. static dispatch_once_t onceToken;
  5. dispatch_once(&onceToken, ^{
  6. _person = [[self alloc] init];
  7. });
  8. return _person;
  9. }

提供copyWithZone:方法

若类遵循<NSCopying>协议,则需提供一下方法

  1. - (id)copyWithZone:(NSZone *)zone
  2. {
  3. return _person;
  4. }

使用宏抽取公共方法

所有实现单例模式的类

所以可以新创建一个Singleton.h文件,声明共有宏

  1. // .h文件
  2. #define XMGSingletonH + (instancetype)sharedInstance;
  3. // .m文件
  4. #define XMGSingletonM \
  5. static id _instace; \
  6. \
  7. + (instancetype)allocWithZone:(struct _NSZone *)zone \
  8. { \
  9. static dispatch_once_t onceToken; \
  10. dispatch_once(&onceToken, ^{ \
  11. _instace = [super allocWithZone:zone]; \
  12. }); \
  13. return _instace; \
  14. } \
  15. \
  16. + (instancetype)sharedInstance \
  17. { \
  18. static dispatch_once_t onceToken; \
  19. dispatch_once(&onceToken, ^{ \
  20. _instace = [[self alloc] init]; \
  21. }); \
  22. return _instace; \
  23. } \
  24. \
  25. - (id)copyWithZone:(NSZone *)zone \
  26. { \
  27. return _instace; \
  28. }

则上面的Person类可以这样定义

  1. // .h文件
  2. #import <Foundation/Foundation.h>
  3. #import "Singleton.h"
  4. @interface Person : NSObject
  5. XMGSingletonH
  6. @end
  7. // .m文件
  8. #import "Person.h"
  9. @interface Person()
  10. @end
  11. @implementation Person
  12. XMGSingletonM
  13. @end

非GCD方法(不推荐)

  1. @implementation XMGPerson
  2. static id _instance;
  3. + (instancetype)allocWithZone:(struct _NSZone *)zone
  4. {
  5. // 加上同步锁
  6. @synchronized(self) {
  7. if (_instance == nil) {
  8. _instance = [super allocWithZone:zone];
  9. }
  10. }
  11. return _instance;
  12. }
  13. + (instancetype)sharedInstance
  14. {
  15. @synchronized(self) {
  16. if (_instance == nil) {
  17. _instance = [[self alloc] init];
  18. }
  19. }
  20. return _instance;
  21. }
  22. - (id)copyWithZone:(NSZone *)zone
  23. {
  24. return _instance;
  25. }
  26. @end
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注