经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » iOS » 查看文章
iOS 单例模式简单实例
来源:cnblogs  作者:纯粹的code  时间:2018/12/11 9:21:00  对本文有异议

 单例模式主要实现唯一实例,存活于整个程序范围内,一般存储用户信息经常用到单例,比如用户密码,密码在登录界面用一次,在修改密码界面用一次,而使用单例,就能保证密码唯一实例。如果不用单例模式,init 两个的实例的堆栈地址不一样,所以存放的数据的位置也不一样,当其中一个数据改变,另一个数据依然不变。单例模式的代码如下

 .h文件

  1. #ifndef Singleton_h
  2. #define Singleton_h
  3.  
  4. @interface Singleton : NSObject
  5. @property (nonatomic, copy) NSString *pass;
  6. + (Singleton *) sharedInstance;
  7. @end

.m文件

  1. #import <Foundation/Foundation.h>
  2. #import "Singleton.h"
  3.  
  4. @implementation Singleton
  5. static id sharedSingleton = nil;
  6. + (id)allocWithZone:(struct _NSZone *)zone
  7. {
  8. if (sharedSingleton == nil) {
  9. static dispatch_once_t onceToken;
  10. dispatch_once(&onceToken, ^{
  11. sharedSingleton = [super allocWithZone:zone];
  12. });
  13. }
  14. return sharedSingleton;
  15. }
  16. - (id)init
  17. {
  18. static dispatch_once_t onceToken;
  19. dispatch_once(&onceToken, ^{
  20. sharedSingleton = [super init];
  21. });
  22. return sharedSingleton;
  23. }
  24. + (instancetype)sharedInstance
  25. {
  26. return [[self alloc] init];
  27. }
  28. + (id)copyWithZone:(struct _NSZone *)zone
  29. {
  30. return sharedSingleton;
  31. }
  32. + (id)mutableCopyWithZone:(struct _NSZone *)zone
  33. {
  34. return sharedSingleton;
  35. }
  36. @end

宏实现单例

  1. #ifndef Singleton_m_h
  2. #define Singleton_m_h
  3.  
  4. // 帮助实现单例设计模式
  5. // .h文件的实现
  6. #define SingletonH(methodName) + (instancetype)shared##methodName;
  7.  
  8. // .m文件的实现
  9. #if __has_feature(objc_arc) // 是ARC
  10. #define SingletonM(methodName) static id _instace = nil; + (id)allocWithZone:(struct _NSZone *)zone { if (_instace == nil) { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instace = [super allocWithZone:zone]; }); } return _instace; } - (id)init { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instace = [super init]; }); return _instace; } + (instancetype)shared##methodName { return [[self alloc] init]; } + (id)copyWithZone:(struct _NSZone *)zone { return _instace; } + (id)mutableCopyWithZone:(struct _NSZone *)zone { return _instace; }
  11. #else // 不是ARC
  12.  
  13. #define SingletonM(methodName) static id _instace = nil; + (id)allocWithZone:(struct _NSZone *)zone { if (_instace == nil) { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instace = [super allocWithZone:zone]; }); } return _instace; } - (id)init { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instace = [super init]; }); return _instace; } + (instancetype)shared##methodName { return [[self alloc] init]; } - (oneway void)release { } - (id)retain { return self; } - (NSUInteger)retainCount { return 1; } + (id)copyWithZone:(struct _NSZone *)zone { return _instace; } + (id)mutableCopyWithZone:(struct _NSZone *)zone { return _instace; }
  14. #endif /* Singleton_m_h */

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号