前言

苹果在2011年的WWDC大会上发布了iOS5,不过考虑到要支持iOS4.x的系统,大多数App都无法使用iOS5的新特性。现在将近1年半过去了,从我们自己的App后台的统计数据、一些第三方的统计数据和一些业界的朋友告知我的数据都显示,iOS4.x的系统所占比例已经小于5%了,并且还在持续下降。所以,我们有必要放弃对iOS4.x的支持,全面拥抱iOS5。

只支持iOS5.0以上版本使得我们可以使用iOS5带来的诸多新特性,有些新特性可以极大地方便我们的开发,我将这些新特性列举如下。

Storyboard

Storyboard(故事板)是XCode4和iOS5提供的一个用于控制View Controller之间跳转关系的新概念。你可以把它理解成以前一堆Nib文件的集合。在这个集合里面,每个Nib文件被称作scene(场景),scene之间的跳转关系被称作segue。segue代表着传统的界面间切换的方式,通常是Push方式和Modal方式,当然,你也可以自定义自己的Segue。如下示例图是一个Storyboard的界面:

使用Storyboard的好处有以下几点:

  1. 你可以从storyboard中很方便地梳理出所有View Controller的界面间的调用关系。比如上面那个storyboard示例图,我们就可以很清楚地了解到4个View Controller相互之间是怎么调用的。而这在以前,这些调用关系,都是隐藏在每个View Controller的代码中的,你需要一点一点读代码,才可以将整个调用逻辑整理清楚。
  2. 使用Storyboard可以使用Table View Controller的Static Cell功能。简单来说,对于象设置页面等固定内容的TableView,可以直接在Storyboard中通过拖拽就可以设置其界面了,而不是象以前那样需要写一堆table view的delegate和data source回调函数。
  3. 通过实现 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 方法,每个View Controller的跳转逻辑都聚集在一处,这方便我们统一管理界面跳转和传递数据,这相当于多了一个编程约定。
  4. Storyboard可以方便将一些常用功能模块化和复用。例如WWDC2011年介绍Storyboard的视频就将微博分享功能模块化成一个单独的Storyboard。我在开发App时,也将例如通过第三方注册登录模块做成一个单独的Storyboard,便于以后复用。

另外,在iOS6中,storyboard又新增了如exit segue, container view等新功能,这些功能都非常体贴,我们向新的技术方案迁移可以在未来更加方便地使用iOS和XCode的新特性,方便我们的开发。

当然,Storyboard也有它的问题。比如,如果2个人同时编译storyboard,在版本管理中出现冲突时会比较麻烦。虽然storyboard是XML格式的,但是里面的信息有些时候还是不太清晰,当冲突发生时,合并冲突可能会比较麻烦。解决办法是,将Storyboard按功能拆分,每个人尽量负责一个单独的Storyboard,如果实在需要2个人都修改它,避免同时修改。

ARC

因为ARC是在编译期做的,所以虽然是与iOS5.0同时推出的Objective-C特性,但是其实ARC是支持iOS4的。只是在iOS4中,不能使用ARC的weak关键字。

由于不需要支持iOS4,我们可以将原本的 __unsafe_unretained 关键字换成weak。这样当这个弱引用对象被回收时,weak指针会被智能地设置成nil,防止“野指针”的产生。

很多人说ARC有这样那样的问题,其实他们是没有真正用好ARC。我在开发粉笔网iPhone客户端时,由于使用了ARC,花三个月开发完的应用,用instruments检测后,没有发现任何内存泄漏问题。这在没有使用ARC的工程中是不可想象的。苹果在推出ARC两年后,今年正式将ARC引入到Mac OS操作系统的SDK中,并且正式将原有的GC deprecated掉,这也说明了ARC技术方案已经是非常成熟的了。

UIKit

UIKit在iOS5进行了大量更新。除了新增了如UIStepper控件外,也为以前的控件增加了更多的定制接口。我们可以方便地定义UINavigationBar, UITabBar, UIToolBar等常用控件。

苹果在iOS5中给UIViewController新增加的5方法以及一个属性。关于这个新特性我在这篇文章中详细介绍过。新增的方法主要解决的是让 view的load/unLoad/appear/disappear的相关回调可以传递到子view controller中。

CoreImage

苹果从iOS5开始,引入了新的图象类CIImage。CIImage相比以前的UIImage类,更加适合于图象处理和图象分析。

在图象处理方法,苹果内置了CIFilter类,方便开发者对图形进行各种各样的特效处理,在iOS5中,苹果提供了48种Filter,而在iOS6中,内置的Filter达到了93种。可以使用如下代码,查询到当前系统中提供的Filter列表:

- (void)logAllFilters {
NSArray * properties = [CIFilter filterNamesInCategory:kCICategoryBuiltIn];
NSLog(@"%@", properties);
for (NSString * filterName in properties) {
CIFilter * fltr = [CIFilter filterWithName:filterName];
NSLog(@"%@", [fltr attributes]);
}
}

这些内置的Filter在分类上,包括:

  1. 颜色效果类。例如黄昏效果,曝光度调整等。
  2. 组合效果类。把2张图片按各种规则混合成一张图。
  3. 几何变形类。例如把照片倾斜或者翻转。
  4. 重复效果类。如平铺,折叠,镜象等。
  5. 失真扭曲类。如把图片中心做成漩涡效果等。
  6. 模糊和锐化类。
  7. Stylize效果。
  8. Halftone效果。

以上所有效果可以叠加作用在一起,最终你可以创造出自己的图片处理效果。最终你可以通过CIContext,将处理过的CIImage转换成UIImage输出。有了Core Image,你可以方便地开发图象处理相关的应用,而不用关心图象处理算法的细节。

NSJSONSerialization

在我的《不要使用SBJSON(json-framework)》 一文中,我提到了关于JSON解析库的性能测试。测试结果表明,苹果从iOS5开始提供的 NSJSONSerialization 类有着最好的性能表现。所以,从iOS5以后,你可以扔掉那些第三方JSON解析库了。

ViewController切换

iOS提供了如下新的接口来切换ViewController,而以前的presentModalViewController和dismissModalViewControllerAnimated被Deprecated掉了。

// 新的接口
- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion;
- (void)dismissViewControllerAnimated: (BOOL)flag completion: (void (^)(void))completion; // 被Deprecated的接口
- (void)presentModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated;
- (void)dismissModalViewControllerAnimated:(BOOL)animated;

新接口的差别是提供了一个completion参数,允许你传入一个block,来定义该操作结束时的回调。使用新的函数后,可以方便同时Dismiss或Present多个View Controller,也可以方便做多个UI效果之间的衔接。

其它

GameKit, Core Data, NewsstandKit, GLKit在iOS5中都有更新。可惜我都没有具体使用过,所以不便做更多介绍。

放弃iOS4,拥抱iOS5的更多相关文章

  1. MinIO很强-让我放弃FastDFS拥抱MinIO的8个理由

    目前可用于文件存储的网络服务选择有很多,比如阿里云OSS.七牛云.腾讯云等等,但是收费都有点小贵.为了帮公司节约成本,之前一直是使用fastDFS作为文件服务器,准确的说是图片服务器.直到我发现了Mi ...

  2. iOS系统自带的 UIAlertView 自动旋转的实现

    这里主要解析 UIAlertView 的几个关键功能的实现: 随着设备屏幕的旋转而旋转: Alert弹出框,使用UIWindow来实现,就是说,不用依赖于当前显示在最前面的UIView. 实现源码参考 ...

  3. iOS开发使用半透明模糊效果方法整理

    虽然iOS很早就支持使用模糊效果对图片等进行处理,但尤其在iOS7以后,半透明模糊效果得到大范围广泛使用.包括今年最新发布的iOS8也沿袭了这一设计,甚至在OS X 10.10版Yosemite中也开 ...

  4. APP测试流程

    1 APP测试基本流程 1.1流程图 1.2测试周期 测试周期可按项目的开发周期来确定测试时间,一般测试时间为两三周(即15个工作日),根据项目情况以及版本质量可适当缩短或延长测试时间.正式测试前先向 ...

  5. Objective-C 中类属性(修饰)

    Objective-C 中类属性(修饰) (2013-07-13 14:38:35) 转载▼ 标签: it 分类: IOS笔记 nonatomic: 非原子性访问,对属性赋值的时候不加锁,多线程并发访 ...

  6. iOS应用开发:什么是ARC

    ARC是什么 ARC是iOS 5推出的新功能,全称叫 ARC(Automatic Reference Counting).简单地说,就是代码中自动加入了retain/release,原先需要手动添加的 ...

  7. ARC小知识

    ARC是iOS 5推出的新功能,全称叫 ARC(Automatic Reference Counting).简单地说,就是代码中自动加入了retain/release,原先需要手动添加的用来处理内存管 ...

  8. iOS viewDidUnload方法

    转自:http://blog.csdn.net/chun799/article/details/8951694 在iOS6中,viewDidUnload回调方法被Deprecated掉了.查看苹果的文 ...

  9. Emoji表情符号兼容方案(适用ios,android,wp等平台)

    http://blog.csdn.net/qdkfriend/article/details/7576524 Emoji表情符号兼容方案 一 什么是Emoji emoji就是表情符号:词义来自日语(え ...

随机推荐

  1. eclipse文本编码格式修改为UTF-8 (转)

    如果要使插件开发应用能有更好的国际化支持,能够最大程度的支持中文输出,则最好使 Java文件使用UTF-8编码.然而,Eclipse工作空间(workspace)的缺省字符编码是操作系统缺省的编码,简 ...

  2. How to use Ajax on Visualforce page on Salesforce platform

    Just use Ajax pattern to call object data from server on visualforce page. Following is the Asynchro ...

  3. XML 文件解析

    1.XML文件 <Data> <Movie id="1"> <title>good lucky to you</title> < ...

  4. Linux使用jstat命令查看jvm的GC情况

    Linux使用jstat命令查看jvm的GC情况 http://www.open-open.com/lib/view/open1390916852007.html http://www.aiuxian ...

  5. HTTP协议开发应用-文件服务器

    HTTP(超文本传输协议)协议是建立在TCP传输协议之上的应用层协议.HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统. 本文将重点介绍如何基于Netty的 ...

  6. poj3642 01背包

    http://poj.org/problem?id=3624 #include<iostream> #include<cstdio> #include<algorithm ...

  7. css整理-06 表和列表

    表格式化 表布局 table, display:table caption, display: table-caption thead, display: table-header-group tbo ...

  8. css整理-02 颜色和字体

    颜色 命名颜色 RGB指定颜色 数值: 0-255 百分比 三元组:红绿蓝 16进制RGB web安全颜色 在256色计算机系统上总能避免抖动的颜色 表示为rgb值20%和51的倍数 web安全色的简 ...

  9. PHP 使用 OSS 批量上传图片

    <?php set_time_limit(0); // 引入自动加载类// 确保路径是否正确 require_once 'autoload.php'; // 确定参数 需要申请 $accessK ...

  10. 我的c++学习(1)hello world!

    // texthello.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> using na ...