日记

首页 » 归档 » 日记 » iOS-singleton(单例)三种创建方式-ios学习从入门到精通尽在姬长信

iOS-singleton(单例)三种创建方式-ios学习从入门到精通尽在姬长信

分享最热门的资讯

单例介绍

  • 单例模式: 一个类只有一个实例对象。

  • 使用场合:在整个应用程序共享一份资源(这份资源只需要创建初始化一次)。

  • ARC实现单例:

  • 在类的内部提供一个static修饰的全局变量static SingletonVC * _singletonVC;;

  • 提供一个类方法方便外界访问+ (instancetype)share;;

  • 重写initWithZone方法,保证永远只为单例分配一次存储空间。

单例写法

第一种:GCD的一次函数(dispatch_once_t)

推荐指数:?????

#import "SingletonVC.h"
// 创建静态对象 防止外部访问
static SingletonVC * _singletonVC;
@implementation SingletonVC
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
    
    static dispatch_once_t onceToken;
    // 一次函数
    dispatch_once(&onceToken, ^{
        if (_singletonVC == nil) {
            _singletonVC = [super allocWithZone:zone];
        }
    });
    
    return _singletonVC;
}
+ (instancetype)share{
    
    return  [[self alloc] init];
}
@end
  • 第二种:线程锁

  • 推荐指数:???

#import "SingletonVC.h"
// 创建静态对象 防止外部访问
static SingletonVC * _singletonVC;
@implementation SingletonVC
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
    
    //线程锁
    @synchronized (self) {
        if (_singletonVC == nil) {
            
            _singletonVC = [super allocWithZone:zone];
        }
    }
    
    return _singletonVC;
}
+ (instancetype)share{
    
    return  [[self alloc] init];
}
@end
  • 第三种:懒加载模式

  • 推荐指数:?

  • 不推荐使用这种方法,线程不安全。

#import "SingletonVC.h"
static SingletonVC * _singletonVC;
@implementation SingletonVC
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
    
    if (_singletonVC == nil) {
        _singletonVC = [super allocWithZone:zone];
    }
    return _singletonVC;
}
+ (instancetype)share{
    
    return  [[self alloc] init];
}
@end

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

ios学习从入门到精通尽在姬长信

(0)

本文由 姬長信 创作,文章地址:https://blog.isoyu.com/archives/20332.html
采用知识共享署名4.0 国际许可协议进行许可。除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。最后编辑时间为:8 月 22, 2017 at 03:02 下午

热评文章

发表回复

[必填]

我是人?

提交后请等待三秒以免造成未提交成功和重复