iOS规范可继承单例

单利平时开发中用的比较多,写一个通用安全的单利是很有必要的
因为单例具有唯一性,要保证每个创建的类是不同的,所以在每个类生成时,我们动态的给类绑定唯一的对象。
使用runTime的关联对象进行创建。

#import "ShareSingle.h"
#import <objc/runtime.h>

@implementation ShareSingle

/** 单例对象 */
+ (instancetype)shareSingle {
    // 获取当前对象的类
    Class selfClass = [self class];
    // 从类中获取对象
    id instance = objc_getAssociatedObject(selfClass, @"shareSingle");
    @synchronized (self) {
        if (!instance) {
            // 不存在,创建对象
            instance = [[super allocWithZone:NULL] init];
            // 给类绑定对象
            objc_setAssociatedObject(selfClass, @"shareSingle", instance, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
        }
    }
    return instance;
}

/** 保证alloc、init也创建同样的对象 */
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
    // 获取当前对象的类
    Class class = [self class];
    // 返回当前类绑定的对象
    return [class shareSingle];
}

- (id)copyWithZone:(struct _NSZone *)zone
{
    return [[self class] shareSingle] ;
}

@end

@implementation Student

@end

@implementation Teacher

@end

在ViewController中测试如下:

- (void)viewDidLoad {
    [super viewDidLoad];
    
    Teacher *objc = [Teacher shareSingle];
    NSLog(@"%p", objc);
    
    Teacher *objc2 = [[Teacher alloc] init];
    NSLog(@"%p", objc2);
    
    Student *subObjc = [Student shareSingle];
    NSLog(@"%p", subObjc);
    
    Student *subObjc2 = [[Student alloc] init];
    NSLog(@"%p", subObjc2);
    
}

测试结果,可以看到无论使用什么方法创建单利,都是同一个对象,并且父类和子类是不同的对象

2019-04-01 10:20:11.336438+0800 Test[98811:3950790] 0x600000200310
2019-04-01 10:20:11.336576+0800 Test[98811:3950790] 0x600000200310
2019-04-01 10:20:11.336711+0800 Test[98811:3950790] 0x60400020a840
2019-04-01 10:20:11.336786+0800 Test[98811:3950790] 0x60400020a840
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,148评论 1 32
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,261评论 4 61
  • 写在前面 教育是个漫长的充满挑战的事业,需要家长和孩子共同进步和努力,使彼此拥有自己的那个恰当的合理的角色,包括家...
    啊伟大的祖国阅读 780评论 0 4
  • 经过了第一第二阶段的准备工作和引流!明天将是第三阶段的成交。就好比上战场,首先你得备有枪,这枪还得要有子弹!再有可...
    付爱宝二妞阅读 188评论 0 0
  • 觉得迷茫啊? 是吧,没有梦想很可怕! 纠结啥 看首要目标 别想太多! 对自己也很无语了? 就是个操心的命! 啊 什...
    哈嗒main阅读 82评论 0 0