• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ios > 如何避免通过[[alloc]init]创建iOS单例类

如何避免通过[[alloc]init]创建iOS单例类

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-05

佚名通过本文主要向大家介绍了alloc init,berryalloc,alloc,cpu sr alloc,alloc chrdev region等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 如何避免通过[[alloc] init]创建iOS单例类
描述:

网站普遍的创建单例类的方法有下面两种:

+ (instancetype)sharedManager {
    static id _sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _sharedInstance = [[self alloc] init];
    });
    return _sharedInstance;
}
+ (instancetype)sharedManager {
    static id _sharedInstance = nil;
    @synchronized(self) {
        if (_sharedInstance == nil)
            _sharedInstance = [[self alloc] init];
    }
    return _sharedInstance;
}

但是该如何避免意外的用[[alloc] init]创建呢?主要是发现网上找到的大多仅仅只有上面的代码,少有考虑被init或者copy的情况


解决方案1:

这样写就可以了

static Singleton *slt = nil;

+ (instancetype)sharedInstance{
   static dispatch_once_t onceToken;
   dispatch_once(&onceToken, ^{
       slt = [[self alloc]init];
   });
   return slt;
}

+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
   static dispatch_once_t onceToken;
   dispatch_once(&onceToken, ^{
       slt = [super allocWithZone:zone];
      
   });
   return slt;
}

- (id)copyWithZone:(NSZone *)zone
{
   return slt;
}

解决方案2:

  • (instancetype)init {
    @throw [NSException exceptionWithName:@"Disable" reason:@"Please use init instead..." userInfo:nil];
    return self;
    }

解决方案3:

覆盖allocWithZone和copyWithZone方法。
因为通过alloc或者copy还是new,都是通过调用allocWithzone和copyWithzone来分配空间的。
你可以把sharedManager 方法里面的代码写到这两个方法里面,就可以从根本实现了单例的情况

解决方案4:

额外创建有很多,还有new方法也可以,把这些方面都重载一遍返回 sharedManager 实例,或者直接抛出异常

解决方案5:

又去stackovweflow找了下方法,我觉得既然是单例模式,调用者就应该严格按照单例的要求,通过统一的接口(这里是sharedInstance)去创建单例,而不应该出现调用[[class alloc] init]也能成功创建单例的情况,如果出现[[class alloc] init]的情况,我觉得更应该让Xcode给出警告不能用此方法

- (instancetype)init NS_UNAVAILABLE;
+ (instancetype)new NS_UNAVAILABLE;

解决方案6:

http://www.jianshu.com/p/08b1...
看看这篇我的写博客.


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 如何避免通过[[alloc]init]创建iOS单例类

相关文章

  • 2017-06-05 如何避免通过[[alloc]init]创建iOS单例类
  • 2017-06-05 iOS开发,如何通过HTTPPost发送这个符号"&"到服务器?
  • 2017-06-05 iosapp开发实现右滑返回上一页和点击栏目条能够返回顶部
  • 2017-06-05 KVC和KVO有什么办法检测KVO中注册过的观察者是否释放。
  • 2017-06-05 C#串口通信AsyncSocket通信客户端识别不了中文
  • 2017-06-05 vmware虚拟机教程ios开发用vmware虚拟机,能否真机调试?
  • 2017-06-05 关于iOS内存管理的问题
  • 2017-06-05 display:inline-block类方法中使用了block,如何避免循环引用?
  • 2017-06-05 如何使用parentViewController
  • 2017-06-05 ios10获取网络权限弹框如何出现?

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • iosAPP能不能打开微信然后通过微信跳转到指定的URL?
    • iOSQuotaExceededErrorDOMException22
    • iOS执行drawLayer:incontext,pop操作后闪退
    • 你们的红点是推送来的么?还是使用http接口
    • 一层一层剥开我的心是什么歌有什么办法快速把网站套一层皮变成手机上的app?
    • Swift如何调用WCF?
    • (swift)求大牛解答php怎么接收ios端request请求中头部的产数
    • clipboardjs是如何控制设备的剪切板的?
    • 使用Swift编写Framework在不同Xcode上使用报错
    • scp命令:ssh连接手机之后,把手机中的文件拷贝到电脑上

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有