《iOS开发进阶》
作者:唐巧
统计分析工具
Flurry: 国外软件,专门针对移动的做了优化,统计流量小,数据安全性高
友盟:国内软件,对国内开发者比价友善。现已被阿里收购,当业务涉及到与阿里冲突时,统计数据会有潜在的安全性问题。这也是京东不支持使用支付宝的原因。
App Annie : 一款专门为开发者提供,针对App store 的统计分析工具,可以统计下载量、排名变化、销售收入情况及用户评价等。
App Figures: 和App Annie 类似的统计分析工具。
崩溃日志记录工具
Crashlytics: 国外软件,信息收集能力强,使用免费,安全。
Xcode 插件管理工具:Alcatraz
可以集成到 Xcode 管理 插件、模板、及颜色配置工具。
安装方法如下图:
常用的Xcode 插件
KSImageNamed: 自动匹配图片资源名
XVim:一个Xcode 的vim 编辑模式插件
FuzzyAutocompletePlugin:代码自动补全插件,Xcode 7.3以上的版本现都已支持。
XToDo : 一个查找项目中所有带有 TODO, FIXME, !!! 等的标记注释。
BBUDebuggerTuchAway:一个当结束调试后,自动隐藏调试窗口的小插件。
SCXcodeSwithExpander : 能迅速在switch 语句中填补所有可能的case:的插件。
deriveddata-exterminator: 一款可以在xcode 菜单清除xcode 缓存的插件,解决一下奇怪的编译错误信息。
VVDocumenter : 一款快速文档注释插件,Xcode 8 现已集成,使用 cmd + option + /
键即可添加。ClangFormat : 一个自动调整代码风格的工具。
ColorSense : 一个使用UIColor 创建颜色时,能实时预览当前颜色
-
XcodeBoost : 包含多个辅助修改代码的小功能,比如:
可以将.m 文件中方法的定义暴露到.h文件中
可以将一个源文件中直接输入正则表达式查找
可以复制粘贴代码时不启用Xcode的自动缩进功能。
ImageOptim : 一款图片压缩工具,比Xcode 自带的pngcrush 压缩工具的压缩比率要高。需要给ipa 包瘦身时可以采用此软件。
蒲公英: 一款应用App的内测分发工具,国内软件,使用比较方便
xctool : 一个Facebook开源的 iOS 编译和测试工具。纯命令行工具
apledoc : 一款从源代码中抽取文档的工具。
内存管理
weak 弱引用修饰的对象,虽然持有对象,但是引用计数不会增加,所以可以避免循环引用。
为了兼容非ARC的三方库,可以在
compile sources
中为对应的.m 文件增加编译参数-fno-objc-arc
来允许对部分文件关闭ARC。
开发技巧
- UILabel 显示模糊:UIlabel 的frame 的origin 值如果有小数就会参数此问题,修改为整数后即可解决。
- NSJSONSerialization 比 NSKeyedArchiver 做数据持久化更方便快捷,性能更好
- UIView 添加动画效果方法是类方法,所以当中的block 绝不会产生循环引用。
- Xcode 快捷键:
cmd + shift + o : 快速查找工程中的类和方法
ESC :调出代码补全窗口
注意:
js 文件被拖到工程后,是在编译列表中,而不是在资源列表中,需要手动的调整其位置,否则不能打包到ipa 文件中,解决方法如下:
由于js文件不需要编译,需要将js文件从Compile Source
编译列表中移动到copy Bundle Resources
中。
清除DerivedData : 当xcode 缓存异常,莫名出现编译错误时,可以尝试清除这里的缓存数据 ~/Library/Developer/Xcode/DerivedData
为工程增加 Daily Build 脚本
学习一门脚本语言(js、Python),可以提高开发效率,自动化批处理一些繁杂重复性强的事情
代码片段用户内容替换命令:<#输入被替换的内容#>
Block 对象模型
block 内部数据结构定义:
解释:
- isa 指针,所有对象都有该指针,用于实现对象相关的功能
- flags , 用于按bit 位表示一下block的附加信息
- reserved ,保留变量
- invoke ,函数指针,指向具体的block实现的函数调用地址
- descriptor,表示该block的附加描述信息
- variables ,capture(捕捉)过来的变量,block能够访问他外部的局部变量,就是因为将这些变量(变量的地址)复制到了结构体
OC 中的3各种Block 类型
- _NSConcreteGlobalBlock,全局的静态block,不会访问任何外部变量。
- _NSConcreteStackBlock,保存在栈中的block,当函数返回时会被销毁。
- _NSConcreteMallocBlock,保存在堆中的block,当引用技数为0时销毁。
Block 对外部变量的复制
对于block外的变量引用:block默认是将其复制到其数据结构中来实现访问的。如果这个对象是一个引用类型,则block 会将其引用计数加1
对于__block 修饰的外部变量引用:block 是复制其引用地址来实现访问的。
图示:
- 在ARC中block 只有
NSConcreteGlobalBlock、NSConcreteMallocBlock
,这2中类型存在,因为ARC 机制已经能很好的管理对象的生命周期,所以这样的block 类型对于系统来说方便管理。
其他
**适合UIWindow 来实现的功能: **
- 手势解锁,密码输入界面
- 应用的启动介绍页
- 应用内的通知提醒显示
- 应用内的弹框广告
App 用户登陆密码安全传输策略:
事先生成一对用于加密的公私钥,客户端在登陆时,使用公钥将用户的密码加密后,将密文传输到服务器。服务器使用私钥将密码解密,然后加盐之后再多次求MD5,之后再和服务器原来存储的用相同方法处理过的密码匹配,如果一致,则登陆成功。