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

 手机用户2502860581 发布于 2022-10-27 12:58

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

+ (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的情况

6 个回答
  • 这样写就可以了

    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;
    }
    2022-10-28 11:34 回答
    • (instancetype)init {
      @throw [NSException exceptionWithName:@"Disable" reason:@"Please use init instead..." userInfo:nil];
      return self;
      }

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

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

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

    - (instancetype)init NS_UNAVAILABLE;
    + (instancetype)new NS_UNAVAILABLE;
    2022-10-28 11:57 回答
  • http://www.jianshu.com/p/08b1...
    看看这篇我的写博客.

    2022-10-28 11:59 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有