(转载)学习唐巧的《iOS开发进阶》

作者Molary已关注

2016.02.28 16:51*字数 4334阅读 1109评论 1喜欢 10

(一)推荐的图书

1.书里推荐的图书:

Object-c程序设计

swift快速入门

跨越终端web

iOS测试指南

(二)推荐的博客和如何更好的学习iOS开发

1.提高iOS开发技能

1)阅读博客

好的博客列表:https://github.com/tangqiaoboy/iOSBlogCN

2)读书

每年至少坚持读完一本高质量的iOS开发图书

3)看WWDC视频

4)看苹果的官方文档

5)看开源项目的代码

除iOS开发本身知识外,还可以学习设计模式和软件架构等

6)多写代码多思考

尽量保持写的代码都具有复用性。代码因为业务需求需要变更时,及时重构,在不要留下技术债的同时,多思考如何设计应用结构,保证满足灵活多变的产品需求,在多次重构和思考中,会慢慢积出一系列的最佳解决办法,成为自己的宝贵经验。

7)多和同行交流

国内的技术社区进行交流,国外的Stack Overflow(http://www.stackoverflow.com)上提问或者回答问题。

8)分享

分享方式:发起一个开源项目,写技术博客,在技术会议上做报告。

(三)摘要:iOS开发工具

1.CocoaPods

CocoaPods项目的源码地址:https://github.com/CocoaPods/CocoaPods

可以节省设置和更新第三方开源库的时间。

使用CocoaPods将用到的第三方库放到profile的文件中,执行pod install。会自动下载下来

注意事项:

1)关于.gitigonre

profile.lock只有在执行pod update才会变更,执行pod install不会改变,不能把profile.lock添加到.gitigonre中。

2)为自己项目创建podspec文件

参考:两篇博文:《如何编写一个CocoaPods的spec文件》(http://ishalou.com/blog/2012/10/16/how-to-create-a-cocoapods-spec-file/)和《cocoapods入门》(http://studentdeng.github.io/blog/2013/09/13/cocoapods-tutorial/)

3)使用私有的pods,不更新podspec

2.网络封包分的截取和分析工具Charles

方便开发中截取调试网络请求内容,分析封包协议,以及模拟慢网速等。

官方网址:http://www.charlesproxy.com

1)可以模拟慢网速

2)截取SSL信息

3)修改网络请求内容

4)修改服务器返回内容

5)Map功能 Map Remote网络请求重新定义到另一个网址,Map Local网络请求重新定义到本地文件。

6)Rewrite对网络请求的结果进行改变

7)Breakpoints功能

3.Reveal

开发时可以动态的查看和修改程序的界面,可以连接真机和模拟器

PonyDebugger和Spark Inspector也是同没醒的界面调试工具,PonyDebugger开源并且免费,Reveal和Spark Inspector是收费的,不过功能更强大些

4.移动统计工具Flurry

https://github.com/tangqiaoboy/FlurryUsageSample

1)每天登录用户数,应用使用次数;

2)使用iOS系统各版本(例如iOS6.0,iOS7.0等)比例。

3)使用iOS各种设备(例如iphone4,iphone5等)比例。

4)crashlog统计

5.崩溃日志记录工具Crashlytics

专门为移动应用开发者提供的保存和分析应用崩溃信息的专业工具。

6.App Store统计工具App Annie

App Store数据的统计分析工具,该工具可以统计App在App Store的下载量,排名变化,销售收入情况及用户评价等信息。

7.Xcode插件

1)Alcatraz管理Xcode插件,http://blog.csdn.net/xiaoliuxingzi/article/details/46889429。

2)KSimageNamed  弹出图片

3)XVim 编辑窗口打开Vim Ctrl+W来切换当前编辑的分栏

4)FuzzyAutocompletePlugin 使用模糊的方式自动补全代码

5)XToDo 提供一个汇总的界面,集中显示所有的未完成的TODO和FIXME标记

6)BBUDebuggerTuckAway 编辑代码的时候自动隐藏底部的调试窗口

7)SCXcodeswitchExpander 迅速的在switch语句中填充枚举类型的每种可能的取值

8)deriveddata-exterminator清除Xcode缓存目录的插件

9)VVDocumenter自动生成代码注释的工具

10)ClangFormat自动调整代码风格的工具

11)ColorSense实时预览相应的颜色

12)XcodeBoost 包含多个辅助修改小代码的功能

9.其它工具介绍

1)取色工具,数码测色计(DigitalColor Meter),苹果自带的类似有xScope

2)图形工具ImageOptim免费图像压缩工具,iOS工程默认使用pngcrush来压缩图片,效率不高,

3)马克鳗 免费标注工具,可以方便地在输出的美术设计稿上标注相应界面元素的大小,颜色,边距,说明等。

4)Dash 快速查看API文档和代码片段管理工具。

5)蒲公英,内测分发工具类似于TestFlight.

6)命令行工具,nomad方便操作苹果开发者中心的命令行工具,添加测试设备,更新证书,增加AppID,验证IAP的凭证。

7)xctool 可在github上下载,开源的iOS编译和测试的工具,可方便进行编辑和单元测试,将测试的结果集成到Jenkins中,实现自动化集成,苹果在OSX Server上推出自动化集成BOT,效果不是很好。

8)appledoc是一个从源代码中抽取文档的工具,可从iOS工程的源代码中抽取相应的注释,生成帮助文档。

(四)有用的技术

1.内存管理,引用计数。

Xcode检测循环引用,使用Xcode的菜单栏选择Product - Profile - Leaks,在单击右下角的Profile按钮开始检测,在Instruments会检测到这次的循环引用,Instruments中会用一条红色的线条来表示一次内存泄露的产生,切换到Leaks这一栏,点击Cycles&Roots,就可以看到以图形的方式显示出来的循环引用,这样我们就可以非常方便地找到循环引用的对象了。

ARC

需要使用_bridge等关键字

将非ARC的工程转换成ARC,Xcode中使用Edit-Refactor-Convert to Object-c ARC

2.CoreFoundation对象的内存管理

底层的内存管理XXCreateWithXxx这样的方式创建,底层的内存管理。

3.GCD

4.UIWindowLevel

UIKIT_EXTERN const UIWindowLevel UIwindowLevelNormal;

切换到用户的界面的时候需要输入密码,有随书的笔记。需要用到UIWindow的情况有应用启动页,应用内通知提醒,输入密码。

5.动态下载系统提供的多种中文字体

苹果提供啦动态下载代码的Demo工程:http://developer.apple.com/library/ios/#samplecode/DownloadFont/Listings/DownloadFont_ViewController_m.html

6.使用应用内支付

1)配置后台

2)配置iTunes Connect

3)iOS端的开发

4)服务器端开发

5)苹果审核应用时,只会在沙盒(sandbox)环境购买,其产生的购买凭证,也只能连接苹果的测试验证服务器,但是审核的应用又是连接的我们的线上服务器,那应该怎么处理?

解决办法是判断苹果正式验证服务器的返回状态码,如果是21007,则再一次连接测试服务器进行验证即可,苹果的文档http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/StoreKitGuide/RenewableSubscriptions

7.基于UIWebView的混合编程

1)模板引擎:MGTemplateEngine,也可以使用GRMustache,

2)Object-c和JavaScript语言的相互调用

原生界面发现以gap请求的地址,就不进行加载,而是执行相应的调用逻辑。这也是Cordova框架调用的原生逻辑机制,

WebViewJavaScriptBridge它能实现相互调用

3)CommonJS规范

4)使用safari进行调试

safari的调试模式打开,safari-preferences-Advanced 勾选上Show Develop menu in menu bar选项

在Iphone模拟器或者真机的设置上把调试模式打开,safari-高级-web检查器

通过USB脸上电脑,safari的Develop菜单下就会多出相应的菜单选项

8.安全性问题

1)安全的传输密码,将密码加密MD5

2)charles将自己的电脑设置成代理服务器,windows环境下使用Fiddler软件,

使用get方式发送密码很不安全,get的URL数据一般都会保存在服务器的access log中,所以黑客一旦攻击啦服务器,只需要扫描access log,则可以轻易获得所有用户的明文密码

3)防止通讯协议被轻易破解

通讯协议被破解,开发者可以选择类似Protobuf,Goole提供的一个开源数据交换格式,对于传输的内容进行一定程度的加密,一增加黑客破解协议的难度。

4)本地文件和数据安全

javaScript的安装包解压可以看到源代码,要对javaScript进行混淆和加密,防止被篡改。

本地数据应该加密存储或者将其保存到keychain中,以保证其不被篡改。

5)通过file,class-dump,theos,otool等工具,黑客就可以分析编译之后的二进制程序文件,IDA是一个收费的反汇编工具,可以采取的措施是,关键逻辑使用纯C实现。

9。基于CoreText排版引擎

CoreText是一个处理文字和字体的底层技术,Quartz是一个2D图形渲染引擎。

使用CoreText排版的是,例如:新浪微博客户端,多看阅读客户端,猿题库都是基于CoreText来排版的,用drawRect方法,就是画图。

复杂的排版引擎分为4类

1)一个是显示用的类,仅负责显示内容,不负责排版;

2)一个模型类,用于承载显示所需要的所有数据

3)一个排版类,用于实现文字内容的排版;

4) 一个配置类,用于实现一些排版时的可配置项。

分成如下:

1)CTFrameParserConfig类,用于配置绘制的参数,例如文字颜色,大小,行间距等

2)CTFrameParser类,用于生成最后回执界面需要的CTFrameRef;

3) CoreTextData类,用于保存由CTFrameParser类生成的CTFrameRef实例,以及CTFrame实际回执需要的高度;

4)CTDisplayView类,持有CoreTextData类的实例,负责将CTFrameRef绘制到界面上

注意:修改CTView的frame信息,需要把use Autolayout的勾选去掉。

(五)实战技巧

1.撤销正在审核的应用;

点击Reject this binary

2.申请加急审核

1)点击Contact us;

2)APP Review;

3)request Expedited review

5) request an expedited app review可加急审核应用。

3.删除设备

每年只有一次机会,延续费用之后第一次登录进去,membersship year开始后即可使用,需要先删除设备,才能新加设备,一旦开始添加,删除不管用。给苹果发邮件,http://developer.apple.com/contact/点击"program benefits"按钮提交,

4)把应用下架

应用上架时间改变

5)收键盘

[self.view endEditing:YES];

[[UIApplication sharedApplication]sendAction:@selector(resignFirstResponder) to:nil for:nil forEvent:nil];

[[UIApplication sharedApplication]endEditing:YES];

6.NSJSONSerialization比NSKeyedArchiver更好在选择持久化方案,快啦7倍

7.修改长按后的中文变英文问题:

用vim打开info.plist,在文件中增加CFBundleLocalizations zh_CN en

8.调用系统方法实现截屏,实现半透明效果

9.内存优化CABackingStore,volatile表示,这块内存可能再次被原变量使用。

10类方法的block不会产生循环引用问题。

11Xcode的快捷键,Behaviors 设置各种行为发生界面应该做何种改变。

12,JavaScript文件设置调整

js后缀的文件默认被拖动到工程中后,是在编译列表,而不是在资源列表。需要手工调整其位置,否则就不能导报到ipa文件中,js不需要编译,需要手工将这个js文件从compile Source移动到copy Bundle Resources.

13.清除DerivedData

缓存路径 ~/Library/Developer/Xcode/DerivedData

工程进行git merge 或者git rebase的时候造成缓存异常。清除缓存后重启Xcode就可以啦

14.target信息异常

编译target异常的时候,可删除UourProjectName.xcodeproj/xcuserdata目录,该目录下有当前用户的各种工程状态信息,删除后重启Xcode,信息会自动重建。

15.下载Xcode https://developer.apple.com/downloads/index.action

16.调剂技巧

1)Opt+Shift可以调出双指拖动效果

2)Opt 可以在模拟器中调出双指放大和缩小效果

3)Shift + cmd + H到Home键

4)Cmd + Left/Right 切换横竖屏

17.xib删除后,并不会立马删除,需要删除应用后重新启动。

18.图片可以直接从Finder拖到模拟器中

19.真机模拟慢网速 :设置-开发者-Status-Network Link Conditioner 中,如果在真机中没有找到,在电脑的Xcode的Origanizer将其设置成测试设备

20.ipa文件格式

把ipa文件名的后缀改成zip,然后双击及可解压打开,解压后再程序的Payload目录下,是一个app后缀的文件夹,在该文件上单击右键选择show Package Contents 即可看到所有的程序资源文件。

21.查看ipa的图片

用命令来解压图片pngcrush -revert -iphone -optimizations 源文件名 目的文件名

22.为项目增加Daily Build

1)保证每天提交代码的可用性

2)进度跟进,产品可以跟进进度,产品经理更多时间来调整他的设计。

3)确认需求,产品经理可以尽早确认开发的功能细节是否符合预期。

4)测试跟进,测试人员可以尽早进行测试。

Xcode提供啦build命令,用xcodebuild -usage可以查看到所有的可用参数。

在Daily Build中,把Release用为Configuration其实不是很好。因为Release证书可能经常会被修改。我们可以基于Release的Configuration。在Info一栏,在Configuration一栏的下方点击+,然后选择Duplicate Release Configuration,新建名为DailyBuild的Configuration.

用xcodebuild -configuration DailyBuild -target "YourProduct"

在bulid里面就会出现一个.app文件啦。这个就是build成功之后的程序文件。

23.生成安装包

使用item-services协议来直接在iphone/ipad上安装应用程序。

24。找不到开发证书。

把开发者证书从登陆拖动到系统栏中

25.可安装脚本自动执行Daily build ,可以参考自动打包脚本ios-makefile 网址https://github.com/lexrus/ios-makefile。

26.用脚本自动生成小尺寸的图片

1)第三方软件XnConvert

2)安装imagemagick,先用brew install  imagemagick

27.检查图片尺寸是否都是偶数

28.代码片段管理

通过快捷键Cmd + Ctrl+Opt + 2调出来。

29.定义自己的代码片段

1)使用git管理代码片段,将自己整理的代码片段都放到Git上,

(六)底层原理

1.isa指针

2.Ruby语言

3.系统相关的API及应用

1)isa swizzling的应用

系统提供的KVO的实现,就利用啦动态地修改isa指针的值的技术。

2)Method Swizzling API说明

特定版本有问题的系统库函数打了Patch.

3)Nimbus工具类库

4)大众点评,自己开发的基于Wax修改而来的WaxPatch,可以实现通过服务器更新来动态修改客户端的逻辑,WaxPatch主要是修改了Wax中的wax_instance.m文件在其中加入了class_replaceMethod来替换原始实现,从而修改客户端的原有行为。

4.Tagged Pointer对象

32位升级到64位,为了改进上面提到的内存占用和效率的问题,苹果提出Tagged Pointer对象,WWDC2013年的视频有介绍,

5.64位下的指针优化

32位环境下,对象的引用计数都保存在一个外部的表中,每一个对象的Retain操作,实际上都包括如下5个步骤

1)获得全局的记录引用计数的hash表

2)为了线程安全,给该hash表加锁

3)查找到目标对象的引用计数值

4)将该引用计数值+1,写会hash表

5)给该hash表解锁

参考文献:https://mikeash.com/pyblog/friday-qa-2013-09-27-arm64-and-you.html

6.block对象模型

1)Block内部数据结构定义

https://llvm.org/svn/llvm-project/compiler-rt/tags/Apple/Libcompiler_rt-10/BlocksRuntime/Block_private.h

6层

1))isa指针,实现对象相关功能

flags,用于按bit位表示一些block的附加信息,

reserved,保留变量

invoke,指向具体的block实现的函数调用地址

descriptor,表示该block的附加描述信息,主要是size,copy,dispose函数的指针

variables,capture过来的变量,block能访问它外部的局部变量,就是因为将这些变量(或变量的地址)复制到了结构体中

2)3种类型的Block

全局的静态block,不会访问任何外部变量;保存在栈中的block,当函数返回时会被销毁;保存在堆中的block,当引用计数为0时会被销毁。

3)用clang分析block实现

用clang工具可以将object-c 的源代码改写成c语言,clang -rewrite -objc block.c

7.参考文献

1)https://llvm.org/svn/llvm-project/

2)http://www.galloway.me.uk/2012/10/a-look-inside-blocks-episode-1/

3)http://rypress.com/tutorials/objective-c/blocks

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

推荐阅读更多精彩内容