为什么学习iOS的单例模式实现

从设计模式开始说起。设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。

单例模式是设计模式中的一种,并且比较简单,在iOS开发中会常用到,所以新手可以先学习使用单例模式。

新手想了解更多设计模式,可以先了解一下类之间的关系,然后看看设计模式一般遵循的6个原则,之后可以了解下23个设计模式。这里23个设计模式,作者是针对java讲的,但对ios程序设计也一样非常有意义。设计模式本身就是最佳实践的一些总结,新手不必一口气把每个设计模式的奥义都搞清楚,只要了解有这种设计模式,在实践中逐步研究和理解,会更有效率。

对于iOS常用的设计模式,推荐阅读破船之家写的三篇iOS设计模式文章,此外,可以参考iOS的一些基本设计模式

什么是单例模式

单例模式,英文名叫Singleton。规定这个类只能同时存在一个实例,这个实例可以全局调用。

什么情况下使用

有个事你只想让一个人去做,这个人把这个事儿做怎么样,你又希望大家都知道,这种时候可以使用单例模式。这个模式可以用来做一些比较“专注”的任务,同时方便的把资源共享出来。

什么情况下不使用

有人说当这个单例类非常频繁会扩展时,单例模式不适用1

还有违反了单一职责的设计原则,使代码之间耦合度变强,无法进行有效的单元测试2。 所以使用的时候要避免这些情况,尽量让单例不存在过于复杂的依赖性和继承,保证其松耦合等3

单例模式实现

破船之家iOS设计模式(02):单例模式文章中写得很清楚,分为使用ARC情况和非ARC情况。我尝试了其中ARC+GCD的方法,it works fine。

测试代码

在下面测试代码中,实现了2个viewController都从单例类实例中拿数据,第1个viewController的按钮更改了单例类实例的内容,在第2个viewController中可以看到更改。 代码下载


  1. 使用单例模式需要注意的几个问题——这篇文章我看得一头雾水,应该怎么理解?

  2. What is so bad about Singletons?,这个问题的被采纳答案

  3. Singletons in Cocoa, are they evil?推荐大家看这个,这个里面援引了stackflow中有人提到的单例的4个缺点。

为什么要学习使用code实现iOS界面?

iOS界面三种实现方式

code、IB、Storyboard这三种方式都可以实现iOS界面,哪种实现方式合适呢?众说纷纭,合理的答案是依情况而定——嘿,废话。作为iOS的初学者,该如何选择呢?

发展趋势

最早时候,大家都用code,后来出现了IB(interface builder),再后来出现了Storyboard。现在的初学者们,上来接触的就是Storyboard,因为苹果现在的官网教材也好、stanford有名的CS193P课程(2013年叫做Coding Together: Developing Apps for iPhone and iPad, 可以在iTunesU中免费下载)都在推Storyboard。

优缺点1

简单对比一下,更多优缺点比较,请搜搜看2

方法 优点 缺点
code 可以对界面掌控得非常精确;代码容易管理和追踪,很干净,控件属性等有修改可以非常容易看到 代码量大,略显麻烦;接手项目的新人不容易看清楚模块之间的关系
ib 较容易地把界面设计出来 界面在ib中体现一部分,在code中体现一部分,阅读和维护起来有难度
Storyboard 较为清晰的体现各模块之间的关系;较容易把界面设计出来 也会借助code来实现一些界面;多人协作开发时,不好管理

可见,使用code实现界面是最基础的方式,ib和storyboard是希望减少工作量。学习使用code开发界面有助于新手理解其中的原理。

新手要熟练使用code,也会Storyboard

真正干活的时候,大家可能会哪个用得熟就用哪个了。对于我们新手,有精力的话,三种方式都要精通。如果没有那么多精力,至少要熟练使用code实现,同时也要会使用Storyboard。因为Storyboard在快速实现demo时,或小项目你自己开发时,效率是非常高的,可以节约你大量时间。并且从发展角度看,Storyboard会做得越来越完善。

如何用code设置控件

推荐这篇文章:IOS开发之纯代码界面—基本控件使用篇,学习的时候,从第一课开始,一节一节仔细阅读。全是干货,非常容易的你就学会了。


  1. Storyboard看上去很美.在这篇文章中,作者根据切身实践对优缺点进行了评述,值得借鉴

  2. 可以参考搜索结果:iOS开发过程中,你更喜欢用Storyboard/xib做界面,还是直接用代码来写界面?; iPhone开发中,代码写界面和IB设计界面哪个更方便?

octopress的官方文档

octopress的官方文档写得非常清晰和简洁,你需要的,基本他都教给你了。虽然中文的大家写的octopress的使用博文非常非常多,但还是建议你先阅读一遍octopress的官方文档,你可以从全貌上了解octopress都能做哪些。

Octopress Documentation

发表文章的过程

  1. 本地建立一个新文章。rake new_post[“new post title”],在“source/_posts/”目录下生成一个markdown文件
  2. 编辑这个markdown文件,你可以改名字,也可以改文件的内容
  3. 使用命令rake generate,这时在本地把你添加的新文章做了生成
  4. 使用命令rake preview,这时在浏览器中输入localhost:4000来在本地查看效果
  5. 效果ok,使用命令rake deploy,把本地的部署到github服务端
  6. 过一会儿之后,你的服务端的blog就更新成最新的啦

管理和配置界面

管理和配置界面,就是修改你本地的若干配置文件,之后rake generate成功后,再deploy,就完成了修改。

拿增加页面为例

搭建好的octopress,默认只有blog和achieve两个页面,要增加页面需要两步:

  1. 本地建立个新文件夹。位置没关系,命令使用rake new_page[new-page-title],这个文件夹内应该会包含一个index.markdown的文件,如果没有这个文件,请新建一个

  2. 在blog主页的导航栏上还需要新建个页面名称,否则在blog上是看不到你新建的页面的,这需要编辑

    source/_includes/custom/navigation.html

编辑后的结果类似:

1
2
3
4
5
6
<ul class="main-navigation">
  <li><a href="/">Blog</a></li>
      <li><a href="/blog/archives">Archives</a></li>
      <li><a href="/about">About Me</a></li>
      <li><a href="/test">Test Field</a></li>
</ul>   

实际上就是把blog主页上导航的部分指向你新建的页面所在的文件夹名称。 部署的方式与发表文章过程一致。

修改页面的方式也可参考为octopress添加新的页面(page),在这片文章中对一个典型的octopress博客的source目录布局进行了描述。

再提一下评论,评论多数人说多说好用,多说的设置参考为 Octopress 添加多说评论系统

更多的配置管理,可自行进行搜索,网上信息很多。比如这位朋友写的配置

最推荐的应该是先阅读这个octopress的官网,信息量非常大。例如Blogging Basics详细儿清晰地介绍了发表文章的过程。

编辑的文章的工具

我在用Mou,markdown语言,挺好使的。

准备工作

安装Ruby(1.9.3)

mac自带的Ruby版本低,不能适用。mac安装Ruby1.9.3的过程参见Mac安装Ruby on Rails,讲的非常清楚。现在有Ruby2.0.0,具体安装方式请google。

你的系统还应该装有git,rvm

开始搭建

搭建过程参考使用Octopress + Github管理blogRuby开源项目介绍(1):octopress——像黑客一样写博客,这第二篇有些标题党哈。这两篇都可参考。

注意:参考这两篇文章前,需要先安装Ruby1.9.3,否则按照他们说的步骤来,你可能遇到很多个步骤无法执行完全成功。

安装过程中可能遇到的问题

1. 如何在mac系统中root权限?

用sudo su,像这样:

1
2
3
4
5
6
shawntekiMacBook-Pro:~ shawnli$ su
Password:
su: Sorry
shawntekiMacBook-Pro:~ shawnli$ sudo su
Password:
sh-3.2#

2. bundle update不成功。

如果遇到的是bundle,command not found

这时你需要安装bundle

shawntekiMacBook-Pro:~ shawnli$ gem install bundler

这时你可能遇到不成功

shawntekiMacBook-Pro:~ shawnli$ gem install bundler
WARNING:  RubyGems 1.2+ index not found for:


RubyGems will revert to legacy indexes degrading performance.
ERROR:  could not find gem bundler locally or in a repository

很可能是网络的问题,你可以尝试使用代理或者从公网换成教育网什么的……成功后显示

shawntekiMacBook-Pro:~ shawnli$ gem install bundler
Successfully installed bundler-1.3.5
1 gem installed
Installing ri documentation for bundler-1.3.5...
Installing RDoc documentation for bundler-1.3.5...

使用下面命令可以查看bundle安装情况

gem list --local

如果bundle update报找不到Gemfile,只要你切换到gemfile那个目录再运行bundle update即可。