MVC架构杂谈

如何分层 模型Model应该放什么代码 I/O操作 视图层的Self-Manager 视图层的动画效果 瘦身Controller 尾言 MVC是软件工程中的一种软件架构模式,它把软件系统分为三个基本的部分:模型Model、视图View以及控制器Controller。这种模式的目的是为了实现一种动态的程序设计,简化后续对软件系统的修改和扩展,并使得程序的某一部分的复用成为可能。三个部分按照其各自的职责划分: 数据Model: 负责封装数据、存储和处理数据运算等工作 视图View: 负责数据展示、监听用户触摸等工作 控制器Controller: 负责业务逻辑、事件响应、数据加工等工作 在传统的MVC结构中,数据层在发生改变之后会通...
Click to read more ...

JavaScript交互

坑爹时代 当前混合开发模式迎来了前所未有的发展,跨平台开发、热更新等优点决定了这种模式的重要地位。虽然前端界面在交互、动效等多方面距离原生应用还有差距,但毫无疑问混合开发只会被越来越多的公司接受。在iOS中,混合开发模式被分为两个时代,分别是iOS7之前的坑爹时代与之后的黄金时代,其分割代表为JavaScriptCore框架 坑爹时代 作为完美避开iOS7之前版本的幸运儿,我只能从某位前辈的口中得知那悲惨的岁月。作为那个年代唯一能与前端界面交互的手段就是UIWebView,先不说它自身的内存泄露缺陷,下面是一段前辈写过的代码: - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRe...
Click to read more ...

模板模式

概述 坏味道的代码 模板设计模式 总结 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。GoF提出了23种设计模式,本系列将使用Swift语言来实现这些设计模式 概述 模板设计模式是最基础的设计模式之一,在网上被称作模板方法模式,但实际运用时这种设计模式却不仅仅局限于方法。因此笔者对于模板设计模式的理解定义如下: 【模板设计模式】将常见的方法以及对象成员进行封装,创建了一个实现一组抽象方法以及抽象对象成员作为对象实现使用的模板 坏味道的代码 在Swift中有个有趣的数据结构——元组Tuples,现在有这么一段代码。其中传入的每一个元祖表示某个商品的数据类型: func calcul...
Click to read more ...

SirKit应用

创建Intents Extension 代码实现 事件UI 尾言 在6月14日凌晨的WWDC2016大会上,苹果提出iOS10是一次里程碑并且推出了十个新特性,大部分的特性是基于iPhone自身的原生应用的更新,具体的特性笔者不在这里再次叙述,请看客们移步WWDC2016下载自行观赏。要说里程碑在笔者看来有些夸大其实了,不过新增的通知中心联动3D Touch确实为人机交互带来新的发展,另外一个最大的亮点在于Siri的接口开放。在iOS10中提供了SiriKit框架在用户使用Siri的时候会生成INExtension对象来告知我们的应用,通过实现方法来让Siri获取应用想要展示给用户的内容 在iOS10之后,苹果希望Siri能够给用户带来更多的功能体验,基于这...
Click to read more ...

认识CoreAnimation

在iOS中,普通的动画可以使用UIKit提供的方法来实现动画,但如果想要实现复杂的动画效果,使用CoreAnimation框架提供的动画效果是最好的选择。那么两种动画方案相比之下,后者存在的主要好处包括不仅下面这些: 轻量级的数据结构,可以同时让上百个图层产生动画效果 拥有独立的线程用于执行我们的动画接口 完成动画配置后,核心动画会代替我们完全控制完成对应的动画帧 提高应用性能。只有在发生改变的时候才重绘内容,消除了动画的帧速率上的运行代码 在CoreAnimation框架下,最主要的两个部分是图层CALayer以及动画CAAnimation类。前者管理着一个可以被用来实现动画的位图上下文;后者是一个抽象的动画基类,它提供了对CAMediaTiming和CA...
Click to read more ...

单元测试

维基百科对单元测试的定义如下: 在计算机编程中,单元测试(英语:Unit Testing)又称为模块测试, 是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。 在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。 根据不同场景,单元的定义也不一样,通常我们将C语言的单个函数或者面向对象语言的单个类视作测试的单元。在使用单元测试的过程中,我们要知道这一点: 单元测试并不是为了证明代码的正确性,它只是一种用来帮助我们发现错误的手段 单元测试不是万能药,它确实能帮助我们找到大部分代码逻辑上的bug,同时,为了提高测试覆盖率,这能逼迫我...
Click to read more ...

消息机制

关于静态语言和动态语言 消息发送 方法缓存 消息转发 消息机制黑魔法 尾话 我们都知道,在iOS中存在这么一个通用类类型id,它可以用来表示任何对象的类型 —— 这意味着我们使用id类型的对象调用任何一个存在的方法,编译器都不会进行报错。比如下面这段代码: id wrongArr = @"This is a NSString instance."; [wrongArr addObject: @"The operate will crash your application"]; 不出意外的,编译器会给你这么一个信息然后华丽丽的崩溃了。相信几乎所有的开发者们在开发生涯中都遇到过这种崩溃信息: -[__NSCFConstantString addObj...
Click to read more ...