iOS Dev Fundamentals----An Brief Introduction to iOS Dev

1 概述

        iOS开发基础技术大致分为以下四个方面:

1)UIKit & Other UI-Related Techniques

       主要指的iOS程序基础架构及用户界面元素(控件及页面绘制、动画等)。

2)Networking

       iOS中常用的Networking技术主要包括HTTP(s)及TCP,前者主要的API封装在URL Loading System中,后者API主要封装在CFNetwork的Stream(ReadStream&WriteStream)中。

3)Concurrency & Threading

       iOS中常用的多线程技术主要包括Operation&OperationQueue, GCD, Threading(NSThread)还有pthread。

4)Software Engineering & Program Design Techniques

        以上几方面为构建一个iOS程序的building blocks,除此之外,还有一方面知识及技术,它不属于以上任何一个课题,而是贯穿、渗透其中,这便是软件设计思想;软件工程方法及软件设计思想解决的是软件生命周期中的“可持续发展”问题,包括易扩展、可复用等;脱离设计思想进行开发的代码难于维护,易于出错。这部分内容比较广,相关的读物也比较多,苹果本身也有对其系统及API的设计理念进行相关的说明(详见:Cocoa Fundamentals Guide,该文档已标记为Retired,但其中的内容仍值得细读)。最基本地,应了解OOD(Object-Oriented Design)中的SOLID原则(FYI: SOLID介绍,链接指向wikipedia.org)及围绕此五大原则展开的相关常用设计模式。

备注:本文提及苹果官方文档主要分为两类:

1)Programming Guide(以下简称PG):主要介绍某个类或者某套API的设计思想及用法,主要用途是对类及API作导引性的介绍;

2)API Reference(以下简称Ref):详尽说明某套API或某个类包含的接口,包括入参、返回值等,主要用途是作为使用手册查阅。

2 UIKit & Other UI-Related Techniques

       UIKit Framework定义、实现了程序及其生命周期、程序运行环境及各种界面、控件元素等API,供我们调用。

2.1 程序生命周期

程序生命周期定义了与程序启动、退出等生命周期相关的关键事件,我们利用这套API可以对程序在其生命周期的关键点的行为进行拦截及干预,比如:

1)为程序添加Push Notification;

2)利用预定义的协议进行App间的通信(通过DeepLink等跨程序手段);

3)其它相关服务,比如Bugly等用户行为数据收集SDK启动等。

2.2 程序运行环境

程序运行的环境主要包括:

1)数据、资源的配置及管理的入口,比如在Xcode中利用plist及ImageAssets等管理语言包、图标等素材;

2)相关环境信息的API,比如屏幕及设备的尺寸、系统版本等提取API(UIScreen&UIDevice等);

3)其它配置等。

2.3 界面、控件等

UIKit的大部分API都是和界面、控件相关的:

1)UIViewControllers及其子类用户管理程序界面层级及界面与数据的交互“中转站”

       iOS中的ViewController分为两种:

· Container View Controller:

       UIKit预定义了几种container view controller,比如UITabBarController、UINavigationController等

· Content View Controller

       为方便使用,UIKit把几种常用的View集成到Controller中,预定义了几种Content View Controller,如UITableViewController,UICollectionViewController等。

关于ViewController的定义及作用可参阅View Controller Programming Guide for iOS;关于具体container view controller&content view controller的用法用相关API需参阅其对应的Ref文档。

2)UIView及其各类子类(控件及非控件子类)用于构建程序的用户界面及处理用户交互相关事件(如点击、拖动等)

        iOS中使用频率较高的几种View有UIView,UIButton,UIImageView,UILabel,UITextField(UITextView),UIScrollView,UITableView, UICollectionView等,开发过程中可选用何种View的主要根据是样式及交互方式(比点击、拖动等)。

        关于UIView的特性(如绘制流程、其在iOS App中的角色)可参阅View Programming Guide for iOS(此文档中的知识较老旧,看得出来苹果已多年未对此文档中的内容进行更新及维护了)。对于ScrollView,TableView及ScrollView等UIView的特定子类,苹果专门为其编写了具体的指引文档,另外苹果对图片、文本等的处理都有相关文档可参阅。

3)其它UI相关扩展

       1)及2)中叙述的属于UIKit中预定义的、相对简单及基础的内容,其中的API只能满足相对寻常的场景,对于特殊场景(比如复杂交互手势处理、特大规模图、文界面绘制及处理),需要对UIKit中的类和对象进行比较深度的“客制化”,为此苹果在提供了相关的基础功能之外,也提供了扩展的入口及可能性。

2.4 动画及其它

1)动画是iOS 程序中不可或缺的元素。动画的本质可以理解为某个(些)属性在某段时间间隔内以某种时间曲线从一个值变化到另一个值的过程。由此,动画包含以下要素:属性、时长、曲线、初始值及末位值。这些要素组合可以产生更复杂的动画,如时长分为几个时间段(每段可配以独立的曲线)可以生成帧动画、多个属性一起变动可以生成组动画、组动画可以配合帧动画一起使用等。从API来说,苹果由简单到复杂提供了基于UIView的动画API、Core Animation等,在此基础上苹果还提供了基于物理引擎的UIDynamics,如果使用以上API仍满足不了需求,还可借助第三方(可能需要付费)编写集成更复杂的骨骼动画等(骨骼动画在App研发中使用较少,游戏中使用较多)。

        Core Animation文档:Core Animation Programming Guide

2)Core Animation除了动画相关的API外,还涉及界面的绘制、渲染等,与此相关的话题可延伸至:

      · Image I/O(图片相关的内存管理、编码解码等API):Image I/O Programming Guide

      · Core Graphics(Quartz 2D):Quzrtz 2D Programming Guide

      · Core Image(CI框架主要涉及人脸识别及滤镜处理):Core Image Programming Guide

      · Core Text框架进行复杂图文绘制及管理(如杂志App等):Core Text Programming Guide

        Core Text是一套偏底层、复杂的API,一般的文本绘制及处理用普通的Label,TextField, TextView配合Text Container&Text Storage即可实现,需要进行较复杂的图文混合排版时则需要使用Core Text。

        关于界面及图文的渲染、绘制流程是一个从宽度和广度来说都比较大的话题,除以上iOS提供的基础技术及框架外,还可延伸至OpenGL ES,苹果亦提供了相关的PG供参考,不过OpenGL ES普通App使用较少。图片相关的操作主要通过UIImage类进行,其背后涉及CGImage及CIImage等附属扩展类,各有不同的使用场景,具体参阅上述PG;图片的编解码操作容易引起性能问题,这部分问题多为CPU承载了过多的编解码操作引起的,优化的方向即把此部分工作由CPU过渡至GPU(因为GPU是图象处理硬件,而CPU是通用硬件),编码及优化过程中尽可能使用GPU相关的API进行操作(如离屏渲染的触发及避免场景)。

On SDWebImage,YYImage, GPUImage and Other Image Processing Frameworks

        目前业内有不少流行的图片(及/或视频)处理的开源框架,实际项目为了稳定性及避免重复劳动,可以集成。当然,这些框架各自存在各自的问题,比如SDWebImage,由于其编解码过程中对内存的使用相对简单粗暴,所以在处理大图片的时候存在一些内存暴涨的问题。

3 Networking

       了解计算机网络相关的概念及设计理念,有助于更好的理解网络编程相关的API;为此,苹果提供了文档(详见:Networking Concepts),对计算机网络进行了简单地“科普”。这份文档介绍的内容与大学“计算机网络”课程大致相当,但相对简要及接地气(贴近实际应用)。

       iOS App研发过程中使用频率比较高的是HTTP(s)及TCP长链接(一般通过socket实现)。

3.1 HTTP(s)

        在基于OC的Foundation层,HTTP(s)相关的网络编程API,苹果官方统称为URL Loading System(以下简称ULS)。这套API除了介绍常规的HTTP(s)交互(GET,POST, PUT,HEAD等)还介绍了自定义协议相关的技术(比如拦截请求用以Mock数据)、对HTTP(s)流程进行必要的干预(比如防止Charles等抓包进行抓包)等。

        ULS提供的API虽然涵盖了常规的HTTP(s)用法,使用相对简单及直白,但对请求及返回所提供的控制比较有限(比如DNS解析、链接的建立及关闭等全部由ULS内部进行了封装,未向开发者暴露相关接口)。若想对请求及返回的过程进行比较精密的控制则需要下潜至Core Foundation层,使用CFNetwork相关API。

        On AFNetworking & ASIHTTPRequest

        关于网络套件,目前业内存在不少成熟、稳定的解决方案,比如早年的基于CFNetwork的ASIHTTPRequest(2013年之前后基本被业界废弃)及目前主流的基于URLSession的AFNetworking,除此之外国内还流行类似YTK等对AFN进行二次封装的网络套件,但这些套件大多过于庞大、臃肿;并且在URLSession发布之后(iOS7.0及更新),AFNetworking的存在似乎没有以前URLConnection时代意义大----因为URLSession这套API的设计吸取了“AFNetworking基于block的回调”的思想,使用URLSession也可以写出紧凑的代码。

3.2 TCP & CFNetwork

在iOS研发中,TCP长链接在编码上有两种实现方式:

1)在基于OC的Foundation层,可使用NSStream(创建过程仍需调用Core Foundation层的API);

2)使用基于C语言的Core Foundation层的CFNetwork(以下简称CFN)相关API。

       事实上,TCP Socket API只是CFN中非常小的一个子集,除此之外,CFN还提供了HTTP、FTP等API。相比基于OC的Foundation层提供的URL Loading System,CFN为HTTP提供了更多的控制入口(比如DNS解析等),当然提供的接口丰富也就意味着在易用性上不如ULS;具体参阅CFNetwork Programming Guide

3.3 扩展研究及阅读

       以上两方面仅从苹果提供的API角度简单介绍了HTTP(s)及TCP长链接相关的技术,更底层的话题超出苹果官方文档涵盖的范围,比如:

1)HTTP(s)协议的设计及演进(虽然现行的HTTP多为1.x及2.0,但目前基于UDP的HTTP 3.0已经萌芽);

2)TCP/IP设计及实现(比如TCP详解一书对此进行了详尽的说明);

3)关于Socket,还可以了解posix socket相关的API,等等。

4 Concurrency&Threading

iOS中的多线程技术从高级到底层依次有Operation/OperationQueue,GCD,NSThread和pthread。

1)Operation/OperationQueue基于GCD进行封装,更“面向对象”,适用于定义比较清晰的任务;它提供了任务状态的管理,包括就绪、开始、完成、取消等,还提供了任务间的依赖关系;

2)GCD比Operation/OperationQueue轻量级,使用起来更方便;它屏蔽了传统线程管理中的锁等同步手段,把程序员从“线程”的概念中解放出来,专注于“任务”(即block);然而,这并不意味着使用gcd不会引起死锁问题,使用过程中仍需谨慎;

       以上两套API为常规研发中多线程编程的首选,从复杂度来说因为它们屏蔽了传统线程管理中复杂的、底层的同步机制(如lock、condition等),对比直接操作线程更方便更易用;当然,在实际使用中有某些场景确实需要直接操作线程(比如需要精准控制延时),则需使用以下技术:

3)NSThread是Foundation层基于OC的多线程API,比较常规的用法应该是NSThread配合NSRunLoop启动常驻线程;

4)pthread是超越iOS的通用API,比如写一些跨平台模块的时候可以使用;另外由于上述三套API所创建的线程都是detached的,而pthread创建的线程默认状态是joinable的,所以在iOS研发中pthread经常被用来创建专用于保存数据的线程。

关于GCD和Operation/OperationQueue,可参阅文档Concurrency Programming Guide

关于NSThread及pthread,可参阅: Threading Programming Guide,该文档中的pthread部分只作了简单介绍,更详细信息需,可参阅:pthread使用手册

5 On Algorithm&Data Structure and Other CS Topics

        算法与数据结构是基础知识,它的意义在于思维模式;掌握算法与数据结构有助于写出更优雅、高效的代码,比如在业务代码中使用更合理的结构的代码解决问题;我们经常可以看到代码中嵌套了很多非必须的循环,并且是多重嵌套;学好算法与数据结构有助于避免这种情况。

         iOS开发与其它开发工作一样,是一个系统工程,仅掌握iOS平台的技术是不够的;计算机网络、操作系统等话题虽然偏理论,掌握这些理论有助于更全面、透彻地理解编程这项工作。

成文仓促,必然有许多错漏。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342