标签: 设计模式

iOS 23种设计模式

设计模式主要分三个类型:创建型、结构型和行为型。 
其中创建型有: 
    一、Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点 
    二、Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。 
    三、Factory Method,工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到了子类。 
    四、Builder,建造模式:将一个复杂对象的构建与他的表示相分离,使得同样的构建过程可以创建不同的表示。 
    五、Prototype,原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象。 
行为型有: 
    六、Iterator,迭代器模式:提供一个方法顺序访问一个聚合对象的各个元素,而又不需要暴露该对象的内部表示。 
    七、Observer,观察者模式:定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知自动更新。 
    八、Template Method,模板方法:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,TemplateMethod使得子类可以不改变一个算法的结构即可以重定义该算法得某些特定步骤。 
    九、Command,命令模式:将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队和记录请求日志,以及支持可撤销的操作。 
    十、State,状态模式:允许对象在其内部状态改变时改变他的行为。对象看起来似乎改变了他的类。 
    十一、Strategy,策略模式:定义一系列的算法,把他们一个个封装起来,并使他们可以互相替换,本模式使得算法可以独立于使用它们的客户。 
    十二、China of Responsibility,职责链模式:使多个对象都有机会处理请求,从而避免请求的送发者和接收者之间的耦合关系 
    十三、Mediator,中介者模式:用一个中介对象封装一些列的对象交互。 
    十四、Visitor,访问者模式:表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这个元素的新操作。 
    十五、Interpreter,解释器模式:给定一个语言,定义他的文法的一个表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 
    十六、Memento,备忘录模式:在不破坏对象的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。 
结构型有: 
    十七、Composite,组合模式:将对象组合成树形结构以表示部分整体的关系,Composite使得用户对单个对象和组合对象的使用具有一致性。 
    十八、Facade,外观模式:为子系统中的一组接口提供一致的界面,fa?ade提供了一高层接口,这个接口使得子系统更容易使用。 
    十九、Proxy,代理模式:为其他对象提供一种代理以控制对这个对象的访问 
    二十、Adapter,适配器模式:将一类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作那些类可以一起工作。 
    二十一、Decrator,装饰模式:动态地给一个对象增加一些额外的职责,就增加的功能来说,Decorator模式相比生成子类更加灵活。 
    二十二、Bridge,桥模式:将抽象部分与它的实现部分相分离,使他们可以独立的变化。 
    二十三、Flyweight,享元模式



<span style="word-wrap: normal; word-break: normal; line-height: 21px;"><br style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; line-height: 26px;" />
<span style="word-wrap: normal; word-break: normal; line-height: 25px; font-family: arial, 宋体, sans-serif;"><strong><span style="word-wrap: normal; word-break: normal; line-height: 21px; color: rgb(0, 0, 153);">设计模式</span></strong>(Design Pattern),是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。</span>



<br style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; line-height: 26px;" />
<span style="word-wrap: normal; word-break: normal; line-height: 25px; font-family: arial, 宋体, sans-serif;">使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 设计模式于己、于他人、于系统都是多赢的,设计模式使代码编制真正工程化。设计模式是软件工程的基石,如同大厦的一块块砖石一样<span style="word-wrap: normal; word-break: normal;">使代码编制真正工程化</span>。</span>



<br style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; line-height: 26px;" />
<span style="word-wrap: normal; word-break: normal; line-height: 25px; font-family: arial, 宋体, sans-serif;"><span style="word-wrap: normal; word-break: normal; line-height: 26px; font-family: Arial;">只有精通了设计模式,才敢说真正理解了软件工程。可以说,设计模式是每一个架构师所必备的技能之一。</span></span>作为一个面向对象设计程序员,只有精通了设计模式,才能摆脱码奴的命运,成为一个真正的软件工程师,才能完成自身价值的飞跃和设计思想的升华!



<br style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; line-height: 26px;" />
<span style="word-wrap: normal; word-break: normal; line-height: 25px; font-family: arial, 宋体, sans-serif;">
</span>



<br style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; line-height: 26px;" />
<span style="word-wrap: normal; word-break: normal; line-height: 25px; font-family: arial, 宋体, sans-serif;">
</span>



<br style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; line-height: 26px;" />
<span style="word-wrap: normal; word-break: normal; line-height: 25px; font-family: arial, 宋体, sans-serif;"><strong>1、设计模式和框架</strong></span>



<br style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; line-height: 26px;" />
<span style="word-wrap: normal; word-break: normal; line-height: 25px; font-family: arial, 宋体, sans-serif;"><span style="word-wrap: normal; word-break: normal; line-height: 24px;">  可复用面向对象软件系统现在一般划分为两大类:应用程序工具箱和</span><span style="word-wrap: normal; word-break: normal; line-height: 24px;">框架</span><span style="word-wrap: normal; word-break: normal; line-height: 24px;">(Framework),我们平时开发的具体软件都是应用程序,Java的API属于工具箱;而框架是构成一类特定软件可复用设计的一组相互协作的类,EJB(Enterprise Java Beans)是Java应用于企业计算的框架。</span></span>



<span style="word-wrap: normal; word-break: normal; line-height: 24px; font-family: arial, 宋体, sans-serif;">  框架通常定义了应用体系的整体结构类和对象的关系等等设计参数,以便于具体应用实现者能集中精力于应用本身的特定细节。框架主要记录软件应用中共同的设计决策,框架强调设计复用,因此框架设计中必然要使用设计模式。</span><span style="word-wrap: normal; word-break: normal; line-height: 24px; font-family: arial, 宋体, sans-serif;"> 
 另外,设计模式有助于对框架结构的理解,成熟的框架通常使用了多种设计模式,如果你熟悉这些设计模式,毫无疑问,你将迅速掌握框架的结构,我们一般开发
者如果突然接触EJBJ2EE等框架,会觉得特别难学,难掌握,那么转而先掌握设计模式,无疑是给了你剖析EJB或J2EE系统的一把利器。</span>

<br style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; line-height: 26px;" />
<span style="word-wrap: normal; word-break: normal; line-height: 25px; font-family: arial, 宋体, sans-serif;">
</span>



<br style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; line-height: 26px;" />
<span style="word-wrap: normal; word-break: normal; line-height: 25px; font-family: arial, 宋体, sans-serif;">
</span>



<br style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; line-height: 26px;" />
<span style="word-wrap: normal; word-break: normal; line-height: 25px; font-family: arial, 宋体, sans-serif;"><strong>2、设计模式的原则</strong></span>



<br style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; line-height: 26px;" />
<span style="word-wrap: normal; word-break: normal; line-height: 25px; font-family: arial, 宋体, sans-serif;"><span style="word-wrap: normal; word-break: normal; line-height: 24px;">近年来,大家都开始注意设计模式。那么,到底我们为什么要用设计模式呢?</span></span><span style="word-wrap: normal; word-break: normal; line-height: 24px; font-family: arial, 宋体, sans-serif;">为什么要提倡<span style="word-wrap: normal; word-break: normal;">设计模式</span>呢?</span>



<br style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; line-height: 26px; font-family: Arial;" />
<span style="word-wrap: normal; word-break: normal; line-height: 24px; font-family: arial, 宋体, sans-serif;">根本原因是为了摆脱编程低效率,提高代码复用,增强代码健壮稳定,增加可维护性。</span>



<br style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; line-height: 26px; font-family: Arial;" />
<span style="word-wrap: normal; word-break: normal; line-height: 24px; font-family: arial, 宋体, sans-serif;">
</span>



<br style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; line-height: 26px; font-family: Arial;" />
<span style="word-wrap: normal; word-break: normal; line-height: 24px; font-family: arial, 宋体, sans-serif;">那怎么才能实现代码复用呢?</span>



<br style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; line-height: 26px;" />
从
面向过程到面向对象,是软件设计诞生以来的迈出的*伟大的一步,面向对象程序设计成功解决了面向过程软件编程的低效率问题,并且彻底改变了人们的编程思
维,为软件设计揭开了新的篇章。然而,要实现面向对象设计,彻底摆脱面向过程设计思维,并不仅仅是只要使用了一门面向对象的编程语言就能够达到的。使用面
向对象设计,可以设计出优秀的软件,同样也可以设计出糟糕的软件。只有遵循一些特定的原则,才能设计出复用性高灵活性好的软件来。



<br style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; line-height: 26px;" />
在运用面向对象的思想进行软件设计时,需要遵循的原则一共有 6 条:


</span>
  1. 单一职责原则(Single Responsibility Principle)
  2. 里氏替换原则(Liskov Substitution Principle)
  3. 依赖倒置原则(Dependence Inversion Principle)
  4. 接口隔离原则(Interface Segregation Principle)
  5. 迪米特法则(Law Of Demeter)
  6. 开闭原则(Open Close Principle)
        在软件设计的过程中,只要我们尽量遵循以上六条设计原则,设计出来的软件才会是一个优秀的软件,它必定足够健壮、足够稳定,并以*大的灵活性来迎接随时而来的需求变更等因素。 3、设计模式的四要素   设计模式使人们可以更加简单方便地复用成功的设计和体系结构。将已证实的技术表述成设计模式也会使新系统开发者更加容易理解其设计思路。

  • 模式名称(pattern name)
   一个助记名,它用一两个词来描述模式的问题、解决方案和效果。命名一个新的模式增加了我们的设计词汇。设计模式允许我们在较高的抽象层次上进行设计。基 于一个模式词汇表,我们自己以及同事之间就可以讨论模式并在编写文档时使用它们。模式名可以帮助我们思考,便于我们与其他人交流设计思想及设计结果。找到 恰当的模式名也是我们设计模式编目工作的难点之一。

  • 问题(problem)
  描述了应该在何时使用模式。它解释了设计问题和问题存在的前因后果,它可能描述了特定的设计问题,如怎样用对象表示算法等。也可能描述了导致不灵活设计的类或对象结构。有时候,问题部分会包括使用模式必须满足的一系列先决条件。

  • 解决方案(solution)
  描述了设计的组成成分,它们之间的相互关系及各自的职责和协作方式。因为模式就像一个模板,可应用于多种不同场合,所以解决方案并不描述一个特定而具体的设计或实现,而是提供设计问题的抽象描述和怎样用一个具有一般意义的元素组合(类或对象组合)来解决这个问题。

  • 效果(consequences)
  描述了模式应用的效果及使用模式应权衡的问题。尽管我们描述设计决策时,并不总提到模式效果,但它们对于评价设计选择和理解使用模式的代价及好处具有重要意义。软件效果大多关注对时间和空间的衡量,它们也表述了语言和实现问题。因为复用是面向对象设计的要素之一,所以模式效果包括它对系统的灵活性、扩充性或可移植性的影响,显式地列出这些效果对理解和评价这些模式很有帮助。 4、设计模式分类概览 《设计模式》一书,第 1 次将设计模式提升到理论高度,并将之规范化。书中一共总结了23种基本的设计模式,《设计模式》下载 这23种设计模式,几乎涵盖了面向对象设计过程中所有问题的解决方案,书中提到的23种设计模式分别是:

设计模式

(Design Pattern)

创建型

(Creational)

结构型

(Structural)

行为型

(Behavioral)

1、Abstract Factory(抽象工厂)

2、Builder(建造者)

3、Factory Method(工厂方法)

4、Prototype(原型)

5、Singleton(单态)

6、Adapter(适配器)

7、Bridge(桥模式)

8、Composite(组合)

9、Decorator(装饰)

10、Façade(外观)

11、Flyweight(享元)

12、Proxy(代理)

13、Chain of Responsibility(职责链)

14、Command(命令)

15、Interpreter(解释器)

16、Iterator(迭代器)

17、Mediator(中介)

18、Memento(备忘录)

19、Observer(观察者)

20、State(状态)

21、Strategy(策略)

22、Template Method(模板方法)

23、Visitor(访问者)

5、设计模式的设计场景 那么如此多的设计模式又是从何而来呢? 《易经》有云:“易有太*,是生两仪,两仪生四象,四象生八卦”,意思就是说世界万物皆有起源。 设计模式的起源,是面向对象程序设计思想,是面向对象设计的精髓——抽象。面向对象通过类和对象来实现抽象,实现时产生了面向对象的三个重要机制:封装、继承、多态,正是这三个机制衍生出了各种各样的设计模式。

设计模式的支持设计

目的

设计模式

可变方面

创建

(Creational)

1、Abstract Factory

2、Builder

3、Factory Method

4、Prototype

5、Singleton

产品对象家族

如何创建一个组合对象

被实例化的子类

被实例化的类

一个类的唯一实例

结构

(Structural)

6、Adapter

7、Bridge

8、Composite

9、Decorator

10、Façade

11、Flyweight

12、Proxy

对象的接口

对象的实现

一个对象的结构和组成

对象的职责,不生成子类

一个子系统的接口

对象的存储开销

如何访问一个对象,该对象的位置

行为

(Behavioral)

13、Chain of Responsibility

14、Command

15、Interpreter

16、Iterator

17、Mediator

18、Memento

19、Observer

20、State

21、Strategy

22、Template Method

23、Visitor

满足一个请求的对象

何时、怎样满足一个请求

一个语言的文法和解释

如何遍历、访问一个聚合的各元素

对象间如何交互、与谁交互

一个对象中哪些私有信息存放在该对象之外,以及在什么时候进行存储

多个对象依赖于另外一个对象,而这些对象又如何保持一致

对象的状态

算法设计

算法中的某些步骤

某些可作用于一个(组)对象上的操作,但不修改这些对象的类

6、设计模式的分类描述 设计模式,分为创建型模式、结构型模式、行为型模式

设计模式的分类描述

创建型模式

1.抽象工厂模式

为一个产品族提供了统一的创建接口。当需要这个产品族的某一系列的时候,可以从抽象工厂中选出相应的系列创建一个具体的工厂类。

2.建造者模式

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

3.工厂方法模式

定义一个接口用于创建对象,但是让子类决定初始化哪个类。工厂方法把一个类的初始化下放到子类。

4.原型模式

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

5.单例模式

确保一个类只有一个实例,并提供对该实例的全局访问。

5.多例模式

确保一个类只有命名的实例,并提供对这些实例的全局访问。

对象池模式

通过回收利用对象避免获取和释放资源所需的昂贵成本。

惰性初始模式

推迟对象的创建、数据的计算等需要耗费较多资源的操作,只有在*次访问的时候才执行。

资源获取为初始化

通过绑定到合适对象的生命周期来确保资源被适当地释放。

结构型模式

6.适配器模式

将某个类的接口转换成客户端期望的另一个接口表示。适配器模式可以消除由于接口不匹配所造成的类兼容性问题。

7.桥接模式

将一个抽象与实现解耦,以便两者可以独立的变化。

8.组合模式

把多个对象组成树状结构来表示局部与整体,这样用户可以一样的对待单个对象和对象的组合。

9.装饰模式

向某个对象动态地添加更多的功能。修饰模式是除类继承外另一种扩展功能的方法。

10.外观模式

为子系统中的一组接口提供一个一致的界面, 外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

11.享元

通过共享以便有效的支持大量小颗粒对象。

12.代理

为其他对象提供一个代理以控制对这个对象的访问。

行为型模式

13.职责链

为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。

14.命令

将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。

15.解释器

给定一个语言, 定义它的文法的一种表示,并定义一个解释器, 该解释器使用该表示来解释语言中的句子。

16.迭代器

提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。

17.中介者

包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用,从而使它们可以松散偶合。当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用,保证这些作用可以彼此独立的变化。

18.备忘录

备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捉住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。

19.观察者模式

在对象间定义一个一对多的联系性,由此当一个对象改变了状态,所有其他相关的对象会被通知并且自动刷新。

20.状态

让一个对象在其内部状态改变的时候,其行为也随之改变。状态模式需要对每一个系统可能取得的状态创立一个状态类的子类。当系统的状态变化时,系统便改变所选的子类。

21.策略

定义一个算法的系列,将其各个分装,并且使他们有交互性。策略模式使得算法在用户使用的时候能独立的改变。

22.模板方法

模板方法模式准备一个抽象类,将部分逻辑以具体方法及具体构造子类的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。先构建一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现。

23.访问者

封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改,接受这个操作的数据结构可以保持不变。访问者模式适用于数据结构相对未定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由的演化。

空对象

通过提供默认对象来避免空引用。

黑板

广义的观察者在系统范围内交流信息,允许多位读者和写者。

规格

以布尔形式表示的可重绑定的商业逻辑。

在面向对象软件设计的发展过程中,除了《设计模式》一书中提到的23中设计模式之外,新的设计模式仍然不断出现。 若想更进一步了解关于面向对象设计的背景,参考接口模式、内聚、耦合。 若想更进一步了解关于面向对象编程的背景,参考继承,重载,多态,接口

自学 iOS 开发的一些经验

不知不觉作为 iOS 开发也有两年多的时间了,记得当初看到 OC 的语法时,愣是被吓了回去,隔了好久才重新耐下心去啃一啃。啃了一阵,觉得大概有了点概念,看到 Cocoa 那么多的 Class,又懵了,怎么才能调用系统的相机?怎么保存信息?怎么做一个像 Twitter 个人页那样的页面?总之就是不知道该从哪切入。

现在回想起来,其实路一直都在,而且有很多条,当初如果有人能够指出一条还不错的道,或许就能走得不那么艰难。于是就有了这篇文章,希望对后人能有所帮助吧。

基础

一定的编程经验

这里说的编程经验是至少熟练一门编程语言,对 OOP 有一定的了解,*好熟悉一些基本的设计模式。遇到过的好多 iOS 开发,大多是从别的语言转过来的,所以有一定的编程基础,学起来会更容易 get the point.

如果是*次接触编程,当然也是没问题的,只是要做好心理准备,可能会比想象的难。

英语

发现不少开发对于英语似乎有点接受不能,通常都是中文优先,除非迫不得已,才硬着头皮看看 StackOverflow,英文文章,文档等。忘了是谁说过「难走的路越走越好走」,通常如此。其实只要稍微 push 一下自己,那些技术文章啃下来应该不会有太大的问题,有过几次成功的体验后,这种恐惧感就会减少很多。优质的文章、视频、书籍,多是英文的,不迈过这个 坎,将来要么成为瓶颈,要么花更大的成本去填补。

入门

书籍

要学习 iOS 开发,自然要先学 Objective-C (当然现在也可以直接上 Swift,不过如果多人协作的话,OC目前还是主流),因为 OC 是 C 语言的超集,所以了解 C 语言对于学习 OC 肯定会有帮助,不过就算不了解,直接学 OC 也没太大问题。

这里推荐 BNR (Big Nerd Ranch) 的这本 Objective-C Programming The Big Nerd Ranch Guide,讲解地比较细致,能帮助你更好的理解 OC,更重要的是教你遇到问题时,如何去解决问题,以及这个问题对应的一些知识点,如何使用文档等等。

来到一个新的世界,肯定会对这个世界充满好奇,想订阅一大堆博客,买一堆书,看各种教程和视频,然后就变得浮躁,不知该从哪下手,这会导致拖延症。 我渴了,给我倒一杯水,这个很直接,马上就可以做,但如果是给我买一瓶饮料,而自己对那些饮料又不怎么熟悉时,就纠结了,不如刷会微博,看看朋友圈,玩个小游戏先。

所以一本好的入门教材很重要,要契合自己当前的水平,且常常会有收获,这种成就感会激励着你继续学下去。

在看书的过程中,往往会有这样的经历:书中提到某个人、观点、知识点、书、文章,然后就顺着它提到的这些东西出去了,可能某个知识点又牵扯到另一些内容,然后就这样越走越远。想起了一个故事——

三只猎狗追一只土拔鼠,土拔鼠逃跑时钻进了一个树洞。这个树洞只有一个出口,不一会儿,忽然从树洞里跑出一只兔子。兔子飞快地向前跑,并爬上另一棵大树。兔子因为慌乱在树上没站稳,掉了下来,砸晕了正仰头看的三只猎狗,*后,兔子终于逃脱。

对于这个故事可以从不同的角度去解读,我更愿意以初心去解读。兔子为什么会爬树?为什么能砸晕三只猎狗?这不是重点,重点是,之前追赶的土拨鼠哪去了?看书时难免会有延伸阅读,这个深度我觉得不宜超过 2 层,不然很容易就回不来了。

还有就是如果有可能,*好每天都看点,这其实是很难的,因为总是会有优先级更高的事,或者之前的某些习惯在干扰。一旦断了几天,就不想再拿起来了。

还有,苹果官方的 Start Developing iOS Apps Today 也是很不错的入门材料。

视频

推荐斯坦福老头子(Paul Hegarty)的 Developing iOS 7 Apps for iPhone and iPad ,当初也是看的这个(那时还是更老的版本),Paul 是资深的 Mac/iOS 开发(前苹果员工?),很多知识点讲得很到位,学生们的提问也大都在点上,同时配有Demo,总之听下来会对 iOS 开发有比较全面的了解。

同时推荐一本小册子:objc-zen-book,花不长时间就能看完,里面是一些 Best Practices,对于编写优质代码会很有帮助。

笔记

这是一个持久的过程,任何阶段都适用。以前也没太在意这个,觉得概念性的东西,脑子过一遍,就大概知道了,然后就去啃其他的东西了,现在看来,如果有记笔记的话,会更有助于消化概念、知识点,也可以记录自己的思考过程。达芬奇就记录了10000多页的笔记。

记笔记可以加深对知识点的理解,而成为编程巨星的唯一秘诀就是:对所做的事情理解地越深,就会做得越好。同时如果遵循遗忘曲线去复习的话,效果更佳。对知识点了解地足够透彻后,Debug 时才更有可能知道问题出在哪,解决问题也更容易有思路。

笔记不仅可以记知识点,也可以记录调试过程,比如这篇笔记,有一种调试方法:小黄鸭调试法

许多程序员都有过向别人(甚至可能向完全不会编程的人)提问及解释编程问题,就在解释的过程中击中了问题的解决方案。一边阐述代码的意图一边观察它实际上的意图并做调试,这两者之间的任何不协调会变得很明显,并且更容易发现自己的错误。

生活中我们可能不会真的这么去做,这时抽离出另一个自己,记录下跟ta的对话,也是个发现问题的好方法。

练习

这也是一个持续的过程,知道了些概念或原理后,总是会想着去验证下是不是这样,无论结果是否如自己预期,实践的过程会降低对语言的陌生感,慢慢地培养一种驾驭这门语言的自信,如果出了错,正好可以重新梳理一下。

目标

如果静下心来看完了 BNR 的这本书,以及斯坦福的 iOS 开发视频,那么对 OC 应该比较了解了,一些常用的 UIKit 用起来也没什么问题了,比如 UIViewController / UIView / UIScrollView / UIImageView / UITableView。也熟悉一些概念,如 KVO / MVC / Delegate / DataSource。

这个阶段下来,应该会有:哦,iOS 开发也就这样嘛,多翻翻文档,熟悉 Cocoa Touch 的一些 Class,差不多也能做出一个简单的 App 了。

进阶

入门之后,接下来可以折腾的东西还会有不少。

书籍

Effective Objective-C 2.0,里面提到了 52 种提高 iOS App 质量的途径。涉及了 API 设计、protocols / category 的使用、写出更模块化的代码等,读下来应该会有不少收获。

iOS Programming: The Big Nerd Ranch Guide (4th Edition),又是一本 BNR 的书,这本书的特点是通过 Demo 来引出知识点,然后提一些问题,并且会细说解题思路。看书的过程中,对于元学习能力的提升也会有一定帮助。

— update —

发现巧哥的 iOS开发进阶 已经可以在京东买到了,虽然没有细看,但巧哥出品质量肯定有保障。

其他资源

进入这个阶段后,可以去探索更大的世界了,现在的资源已经很丰富了,但还是要遵循「少而精」的原则。以下是我觉得挺不错的资源

iOS Dev Weekly 每周一期,内容多为这一星期里值得关注的Github项目、文章、工具等。

iOS 移动开发周报 这是唐巧大大整理的每周不错的 iOS 开发相关的内容,多为中文。

RayWenderlich 很多详细又全面的教程,不容错过。

iOS Dev Slack 国内不少 iOS 开发(包括大大们)都在这里,不过现在好像不怎么能拿到邀请了。

中文 iOS/Mac 开发博客列表,打开工具订阅吧。

还有,如果可能的话,多去分享自己学到的东西,教是*好的学,我试过几次,效果真的很不错。

目标

这个阶段下来,对于常用的设计模式、内存管理、Blocks 的使用、图像操作、网络请求和管理、多线程应该比较熟悉了。对于 CALayer、Animation、UIScrollView、UITableView、UICollectionView、 ViewController Container 则非常熟悉,对「非常熟悉」的定义是:不打开 Xcode,脑子里就能把相应的知识点复述出来 80% ,比如这个类有哪些方法,Delegate / DataSource 有哪些方法,怎么使用,如果要实现某个效果,应该怎么做(好吧, UICollectionView 除外)。

高级

其实高级、进阶、入门并没有严格的界限,在入门阶段也可以探究高级阶段的一些东西。我觉得支撑我们不断探索和前进的动力不是兴趣,而是永不满足的好奇心,和对优雅代码的追求。

If your standards are low, you’re going to stop pretty early on in the process.

BNR 的这篇 Leveling Up 已经讲得很好了,也更加细致。

书籍

iOS 7 Programming Pushing the Limits 这本书对 iOS 7 的一些特性会讲解地比较深入,当然也不仅仅是 iOS 7。只叹 iOS 更新实在太快,书籍往往跟不上,一本好书往往需要很长时间来撰写,等书可以出版了,iOS 又出新版本了。

源码

看优秀的源码,可以学到很多东西,使用过程中遇到问题也更容易解决。这些是我觉得值得细看的源码:AFNetworking(NSOperation, HTTP, Block), SDWebImage(Image Handle, Cache, NSOperation, Block),SVPullToRefresh(UIScrollView, State Handle), JSONModel(runtime)

如果有兴趣,也可以翻翻 CoreFoundation / OC runtime 的源码。

资源

oleb

NSHipster

objc.io || objcio.cn

WWDC 视频

工具

chisel Facebook 出品的 LLDB 助手,用于调试很方便

Reveal 每当好奇某个 App 的实现时,都会打开它一窥究竟,用于调试自己的 App 也很方便

Aspects steipete 大大出品的一款方便使用 method swizzling 的工具,可以在运行时动态添加代码到某个方法

class-dump 从 Mach-O 文件生成 OC 头文件,有时想看看某个 App 大概是如何组织的会比较方便

Hopper 可以对二进制文件进行反编译,甚至可以生成伪代码!有时想看看 UIViewController 里某个方法大概是怎么实现的,就可以用它。

Instruments 这个内置的工具对于发现 App 的各种问题很有帮助,如内存占用、泄露,渲染问题等。

目标

这个阶段,对于底层的实现会有更深入的了解,各种 Core 开头的 Framework 至少可以说出个大概,工具也能熟练使用,「正经的代码」写过数万行,可能天天在翻 Dash。如果别人让你实现某个功能,能在较短的时间内给出不错的实现方案,并且足够细致,甚至精细到如何使用 Core Graphic 去画某个图像。

其他

我觉得无论学习什么,「速成」的心态是*要不得的,这只会让自己变得浮躁,一知半解,整个过程也很难让自己的元学习能力得到提升。慢慢来,攻占一个城后,再去打下一个,这时心态也会平和许多。

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速