有没有自己开发iOS的经验?
一些编程经验。
这里说的编程经验是至少精通一门编程语言,对OOP有一定的了解,最好熟悉一些基本的设计模式。我遇到的很多iOS开发,大多是从其他语言转来的,所以有一定的编程基础,学起来会比较容易抓住重点。
如果是第一次接触编程,当然没有问题,做好心理准备就行,可能比想象的要难。
英语
发现很多开发者似乎对英文有点接受不了,通常首选中文。除非万不得已,你得看StackOverflow,英文文章,文档等。忘了是谁说的“路越难越好走”,一般都是这样。其实只要稍微推自己一把,那些技术文章应该没多大问题。几次成功的经历后,这种恐惧会减少很多。高质量的文章、视频和书籍大多是英文的。不跨过这个坎,要么成为未来的瓶颈,要么花更多的钱去填补。
初级课程
书
学习iOS开发,自然是先学习Objective-C(当然现在也可以直接去Swift,但是多人协作的话OC还是主流),因为OC是C语言的超集,所以懂C语言肯定对你学习OC有帮助,但是就算不懂,直接学习OC也不是太大的问题。
这里推荐BNR(大书呆子牧场)的《objective-c编程大书呆子牧场指南》,里面讲解的很详细,可以帮助你更好的理解OC,更重要的是教你遇到问题如何解决,以及这个问题对应的一些知识点,如何使用文档等等。
当你来到一个新的世界,你一定会对这个世界充满好奇,想订阅很多博客,买很多书,看各种教程和视频,然后你就会变得浮躁,不知道从哪里开始,从而导致拖延症。我渴了,给我倒杯水吧。这个很直接,我马上就能做到。但是如果我买了一瓶饮料,对那些饮料不熟悉,我就会纠结。要不我先刷刷微博,看看朋友圈,玩个小游戏?
所以,一本好的入门教材很重要,它要符合你现在的水平,你会经常有所收获。这种成就感会鼓励你继续学习。
在阅读一本书的过程中,往往会有这样一种体验:书中提到一个人、一个观点、一个知识点、一本书、一篇文章,然后沿着它提到的这些东西走出去。可能一个知识点涉及到其他内容,然后他们就越走越远了。我想起了一个故事-
三只猎犬追赶一只土拨鼠,土拨鼠逃跑时钻进了一个树洞。这个树洞只有一个出口。很快,一只兔子突然从树洞里跑了出来。兔子快速向前跑,爬上了另一棵大树。兔子因为惊慌在树上失去了立足之地,摔倒了,惊呆了三只抬头张望的猎犬。最后,兔子终于逃脱了。
这个故事可以从不同的角度解读,我更愿意用心去解读。兔子为什么要爬树?为什么能打晕三只猎犬?这不是重点。重点是,我们之前追的土拨鼠呢?看书难免会有延伸阅读。我觉得这个深度不要超过2层楼,不然很容易回来。
还有,如果可能的话,最好每天看,其实很难,因为总会有优先级更高的事情或者之前的一些习惯干扰。一旦坏了几天就不想再捡了。
还有,苹果今天正式开始开发iOS应用也是非常好的入门材料。
录像
我推荐保罗·赫加蒂为iPhone和iPad开发的iOS 7应用程序,他一开始也看了这部(当时还是老版本)。保罗是资深Mac/iOS开发者(前苹果员工?),很多知识点都很到位,大部分同学的问题都很中肯,同时还有一个Demo。总之,听完之后你会对iOS开发有一个全面的了解。
同时推荐一本小册子:objc-zen-book,可以在短时间内阅读,里面包含了一些最佳实践,对于编写高质量的代码会有很大的帮助。
笔记
这是一个持久的过程,可以在任何阶段应用。之前没太关注这个。我以为概念性的东西想了就知道了,然后就去啃别的东西了。现在看来,如果我做笔记,对概念和知识点的消化会更有帮助,也可以记录自己的思考过程。达芬奇记录了超过10000页的笔记。
做笔记可以加深对知识点的理解,而成为编程巨星的唯一秘诀就是,你对自己在做的事情理解得越深,就会做得越好。同时,如果按照遗忘曲线来复习,效果会更好。在你对知识了解的足够透彻之后,在调试的时候更容易知道问题出在哪里,也更容易有解决问题的思路。
笔记不仅可以记录知识点,还可以记录调试过程。比如这个笔记里有一个调试方法:小黄鸭调试法。
很多程序员都向别人(甚至是根本不会编程的人)请教和讲解过编程问题,在讲解的过程中击中了问题的解决方法。在解释代码意图的同时,观察其实际意图,并进行调试。两者任何不和谐都变得明显,更容易发现自己的错误。
我们在生活中可能不会真的这样做。这时候,把另一个自己拉出来,把和ta的对话录下来,也是找到问题的好方法。
练习
这也是一个持续的过程。知道了一些概念或者原理之后,总想验证一下是不是这样。无论结果是否如预期,练习的过程都会减少语言的陌生感,逐渐培养出一种掌握语言的信心。如果出了问题,我可以重新解决。
目标
如果你静下心来看完BNR的书和斯坦福的iOS开发视频,你应该会更了解OC,一些常用的UIKit用起来会没问题,比如UIView controller/ui view/ui scroll view/ui imageview/UITableView。我也熟悉一些概念,比如KVO/MVC/Delegate/DataSource。
现阶段应该有:哦,iOS开发就是这样。多看文档,熟悉Cocoa Touch的一些类,差不多就能做一个简单的App了。
先进的
入门之后,接下来还会有很多可以折腾的东西。
书
有效目标——C 2.0,其中提到了提升iOS App质量的52种方法。它涉及到API设计、协议/类别的使用、编写更模块化的代码等。看完应该会有不少收获。
IOS编程:大书呆子牧场指南(第四版)另一本BNR的书,特点是通过Demo引出知识点,然后提出一些问题,详细讲解解题思路。在阅读的过程中,也会有助于提高元学习能力。
-更新-
我发现在JD.COM已经可以买到桥哥的高级iOS开发了。虽然我没有仔细看,但是乔哥的产品质量肯定是有保障的。
其他资源
进入这个阶段后,我们可以探索更大的世界。现在资源已经很丰富了,但还是要遵循“少而精”的原则。以下是我觉得挺好的资源。
IOS Dev Weekly每周出版一期,内容多为Github项目、文章、工具等。本周值得关注的问题。
IOS Mobile Development Weekly这是一个很好的关于IOS开发的周内容,由唐乔大大整理,大部分是中文。
RayWenderlich有很多详细全面的教程,不容错过。
IOS Dev Slack国内很多IOS开发者(包括成年人)都来了,但是现在看来是拿不到邀请了。
中文iOS/Mac开发博客列表,打开工具订阅。
还有,如果可能的话,分享一下你学到的东西。教学是最好的学习方式。我试过几次,效果真的很好。
目标
在这个阶段,您应该熟悉常见的设计模式、内存管理、块的使用、映像操作、网络请求和管理以及多线程。我非常熟悉CALayer、Animation、UIScrollView、UITableView、UICollectionView、ViewController容器。“非常熟悉”的定义是:在不打开Xcode的情况下,80%的对应知识点能在脑海中重复。比如这个类的方法有哪些?Delegate/DataSource的方法有哪些,怎么用,想达到一个效果怎么办(嗯,UICollectionView除外)。
年长的
其实高级、进阶、入门并没有严格的界限,有些高级阶段的东西在入门阶段也是可以探索的。我觉得支撑我们不断探索和进步的动力不是兴趣,而是永不满足的好奇心和对优雅代码的追求。
如果你的标准很低,你会在过程中很早就停止。
BNR的升级非常好,而且更加详细。
书
《IOS 7编程挑战极限》这本书会深入讲解iOS 7的一些特性,当然不仅仅是iOS 7。只是感叹iOS更新太快,书经常跟不上。一本好书往往要写很长时间,等到书可以出版的时候,iOS的新版本就出来了。
源代码
看看优秀的源代码,可以学到很多东西,使用过程中遇到的问题也比较容易解决。这些是我认为值得仔细看看的源代码:AF联网(ns操作,http,block),SDWebImage(图像句柄,缓存,ns操作,block),SVPulltoRefresh (uiscrollview,状态句柄),JSON模型(运行时)。
有兴趣的话还可以浏览CoreFoundation/OC运行时的源代码。
资源
oleb
NSHipster
objc . io | | objcio.cn
WWDC视频
工具
chisel脸书公司生产的LLDB助手调试起来非常方便。
Reveal每当对某个App的实现感到好奇的时候就会打开它,这样也方便调试自己的App。
Aspectsteipete是一个易于使用方法切换的工具,可以在运行时动态地向方法添加代码。
Class-dump从Mach-O文件生成OC头文件,有时可以方便地看到一个App是如何组织的。
Hopper可以反编译二进制文件,甚至生成伪代码!如果您想了解UIViewController中的某个方法可能是如何实现的,有时可以使用它。
Instruments这个内置的工具,对于发现App的各种问题,比如内存占用、泄露、渲染问题等等,是很有帮助的。
目标
在这个阶段,我们将对底层实现有更深入的了解。各种核心开头的框架至少能给出一个大概的思路,工具也能熟练使用。写了几万行“正经代码”,Dash可能天天翻。如果有人让你实现一个功能,你可以在短时间内给出一个很好的实现方案,而且足够详细,甚至详细到可以画出一个有核心图形的图像。
其他的
我觉得不管学什么,“速成”的心态是最不可取的,只会让你浮躁,一知半解,很难在整个过程中提高你的元学习能力。慢慢来,占领一个城市,然后再占领另一个。这个时候,你的心态会平和很多。