设为首页收藏本站language→→ 语言切换

鸿鹄论坛

 找回密码
 论坛注册

QQ登录

先注册再绑定QQ

查看: 489|回复: 1
收起左侧

iOS单例案例 南京iOS培训带大家一起解析

[复制链接]
发表于 2016-7-5 17:18:55 | 显示全部楼层 |阅读模式
  本文南京万和iOS培训一起来看看单例的概念、用途、如何创建,以便加深理解。在开发中经常会用到单例设计模式,目的就是为了在程序的整个生命周期内,只会创建一个类的实例对象,而且只要程序不被杀死,该实例对象就不会被释放。

  创建单例

  有两种方法来创建单例,下面南京万和iOS培训分别介绍

  1、GCD方式创建单例


                               
登录/注册后可看大图

  2、互斥锁方式

                               
登录/注册后可看大图

  上面两种方式都可以创建单例,而且保证了用户不管是通过shareInstance方法,还是alloc、copy方法得到的实例都是一样的。想要了解更多内容,请咨询南京万和iOS培训

  上面代码的关键之处就在于如何在多线程情况下保证创建的单例还是同一个。

  我们先看看在GCD情况下,如果不使用dispatch_once和同步锁创建单例会出现什么问题,去掉两者后创建单例的代码如下


                               
登录/注册后可看大图

  假设此时有两条线程:线程1和线程2,都在调用shareInstance方法来创建单例,那么线程1运行到if (_instance == nil)出发现_instance = nil,那么就会初始化一个_instance,假设此时线程2也运行到if的判断处了,此时线程1还没有创建完成实例_instance,所以此时_instance = nil还是成立的,那么线程2又会创建一个_instace。

  此时就创建了两个实例对象,导致问题。

  解决办法1、使用dispatch_once

  dispatch_once保证程序在运行过程中只会被运行一次,那么假设此时线程1先执行shareInstance方法,创建了一个实例对象,线程2就不会再去执行dispatch_once的代码了。从而保证了只会创建一个实例对象。


                               
登录/注册后可看大图

  解决办法2、使用互斥锁

  假设此时线程1在执行shareInstance方法,那么synchronize大括号内创建单例的代码,如下所示:

  就会被当做一个任务被加上了一把锁。此时假设线程2也想执行shareInstance方法创建单例,但是看到了线程1加的互斥锁,就会进入睡眠模式。等到线程1执行完毕,才会被唤醒,然后去执行上面所示的创建单例的代码,但是此时_instance !=nil,所以不会再创建新的实例对象了。从而保证只会创建一个实例对象。

  但是互斥锁会影响性能,所以最好还是使用GCD方式创建单例。想要了解更多内容,请咨询南京万和iOS培训

  作用

  在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在APP开发中我们可能在任何地方都要使用用户的信息,那么可以在登录的时候就把用户信息存放在一个文件里面,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。

  有的情况下,某个类可能只能有一个实例。比如说你写了一个类用来播放音乐,那么不管任何时候只能有一个该类的实例来播放声音。再比如,一台计算机上可以连好几个打印机,但是这个计算机上的打印程序只能有一个,这里就可以通过单例模式来避免两个打印任务同时输出到打印机中,即在整个的打印过程中我只有一个打印程序的实例。

  宏创建单例

  如果我们需要在程序中创建多个单例,那么需要在每个类中都写上一次上述代码,非常繁琐。

  我们可以使用宏来封装单例的创建,这样任何类需要创建单例,只需要一行代码就搞定了。

  实现代码


                               
登录/注册后可看大图

  如何调用

  假设我们要在类viewcontroller中使用,调用方法如下:


                               
登录/注册后可看大图

  输出结果

  可以看到四个对象的内存地址完全一样,说明是同一个对象。


                               
登录/注册后可看大图

  想学iOS开发吗?那就来江苏万和计算机培训中心吧。江苏万和作为南京专业的iOS培训中心专门培养iOS移动开发人才,欢迎广大有志于此行业发展的学员们加入。

 楼主| 发表于 2016-7-8 17:17:55 | 显示全部楼层
想要学习iOS开发的小伙伴,可以咨询江苏万和的老师哦,tel:13813826004。
现在暑假还有学IT技术,送旅游的活动。想要学IT的小伙伴,走起来~
沙发 2016-7-8 17:17:55 回复 收起回复
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2024-4-19 15:54 , Processed in 0.062650 second(s), 12 queries , Redis On.  

  Powered by Discuz!

  © 2001-2024 HH010.COM

快速回复 返回顶部 返回列表