iOS中的单例模式

单例模式是日常开发工作中经常会用到的一种设计模式。通过单例模式,可以保证程序中的一个类只有一个实例,从而方便对实例个数的控制以节省系统资源。因此,如果希望系统中的某个类只有一个实例,那单例模式是比较好的解决方案。

iOS开发中,最常见的单例就是UIApplication。

简单介绍一下iOS中如何实现单例设计模式。

在iOS中,所有对象内存空间的分配,最终都会调用 allocWithZone方法。也就是说,当我们写下如下代码时:

UIButton *btn = [[UIButton alloc] init];

实际上会调用 allocWithZone 方法。因此实现单例时,可以重写 allocWithZone 方法。

另外,GCD 提供了一个方法,是专门用来创建单例的。提供的是 dispatch_once 宏。可以保证块代码中的指令只被执行一次,且多线程时,是线程安全的,类只会被实例化一次。

重写 allocWithZone 方法的代码:

//重写allocWithZone方法实现单例

//GCD提供了一个方法来创建单例,该方法是线程安全的

+ (id)allocWithZone:(struct _NSZone *)zone

{

static Singleton *instance;

//dispatch_once是线程安全的,onceToken默认为0

//且dispatch_once 可以保证块代码中的指令只被执行一次

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

instance = [super allocWithZone:zone];

});

return instance;

}

这样,再实例化类对象时,实际上返回的是一个唯一对象。

为了方便外界访问该实例,可以实现一个 shared***方法,返回该类的实例,代码如下:

+ (instancetype)sharedSingleton

{

return [[self alloc] init];

}

验证代码如下:

- (void)viewDidLoad {

[super viewDidLoad];

Singleton *single = [[Singleton alloc] init];

NSLog(@"single = %@",single);

Singleton *single2 = [Singleton sharedSingleton];

NSLog(@"single2 = %@",single2);

for(int i = 0; i < 10; ++i){

Singleton *testSingle = [[Singleton alloc] init];

NSLog(@"testSingle = %@",testSingle);

}

}

执行结果:

可以看出,无论是多次 alloc ,还是 shared***,得到的实例对象内存地址都是一样的,说明类的实例只有一个。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • @WilliamAlex大叔 前言 目前流行的社交APP中都离不开单例的使用,我们来举个例子哈,比如现在流行的"糗...
    Alexander阅读 1,942评论 6 28
  • 单例模式大概是设计模式中最简单的一个。本来没什么好说的,但是实践过程中还是有一些坑。所以本文小结一下在iOS开发中...
    qiushuitian阅读 3,460评论 1 21
  • 在一个ios应用中,有时候我们只需要某个类的一个实例。即是在整个项目中,这个类的对象只能被初始化一次。 例如,当应...
    蠡园里面有李源阅读 518评论 1 0
  • 单例模式的作用:保证在程序运行过程中,一个类只有一个实例对象,节约系统资源。 单例模式使用场合:在整个应用程序中,...
    Xcode10阅读 370评论 0 0
  • 心脏,乃是人体最重要的器官之一,更有甚者,谓之“五脏之首”、“君主之官”。心脏是我们身体的永动机,拥有一颗好心脏,...
    04b4574d4783阅读 530评论 0 0