美文网首页
10道一篇(一)

10道一篇(一)

作者: struggle3g | 来源:发表于2018-10-25 17:54 被阅读60次

一 如何晋级

之前说一个 iOS 开发者成长到一定阶段,就会遇到瓶颈,解决的方法是熟悉设计模式。接触到 App 的架构App 的架构就类似于现代建筑的脚手架或是地基——一旦确定,App 的骨架和结构就已经定型,剩下的工作就是在现成的架构中舔砖加瓦。那么具体来说,我们为什么要关心 App 的架构?有三点原因。

首先就是代码均摊。试想如果所有代码都集中在一个 UIViewController 中,App 理论上确实能够运行,然而当调试时面对拥有庞大代码的单个文件,我们需要花大量的时间去找到发生问题的源头。同时在修改代码的同时,又因为所有代码都集中在一处,我们必须格外小心,防止一处修改、他处崩溃这种牵一发而动全身的情况出现。这种就像很多团电路交错在一起,即使是熟练的电工也因为过于复杂而觉得无从下手。真正的架构应该合理分配代码,每个类、结构体、方法、变量的存在都应该遵循单一职责原则。

其次是便于测试。测试确保了代码的质量。我们熟知的单元测试、性能测试、UI 测试都是针对单个方法或界面进行测试。架构的合理分配决定了各个测试能够各司其职,不重复、不遗漏,做到最大的测试效率和覆盖率。

最后就是易用性。好的架构确保了日后开发中可以轻松应对各种新需求;即使是新人也可以快速学习并适应现有的架构并进行开发。

围绕目前流行的 MVC,MVP,MVCS,MVVM,VIPER 等架构来展开。由于绝大多数开发者对于部分架构并不熟悉,将着重对架构进行特点分析,并在其之间进行横向比较。

二 OOPvsPOP

1.什么是 OOP ?它在 iOS 开发中有哪些优点?

关键词:#面向对象编程

OOP 全称是 Object Oriented Programming,即面向对象的编程,是目前最主流的编程范式。在 iOS 开发中,绝大多数的部分运用的都是 OOP。

在 iOS 开发中,它有如下优点:

封装和权限控制。相关的属性和方法被放入一个类中,Objective-C 中 ".h" 文件负责声明公共变量和方法,".m" 文件负责声明私有变量,并实现所有方法。Swift 中也有 public/internal/fileprivate/private 等权限控制。
命名空间。在 Swift 中,不同的 class 即使命名相同,在不同的 bundle 中由于命名空间不同,它们依然可以和谐共存毫无冲突。这在 App 很大、bundle 很多的时候特别有用。Objective-C 没有命名空间,所以很多类在命名时都加入了驼峰式的前缀。
扩展性。在 Swift 中,class 可以通过 extension 来进行增加新方法,通过动态特性亦可以增加新变量。这样我们可以保证在不破坏原来代码封装的情况下实现新的功能。Objective-C 中,我们可以用 category 来实现类似功能。另外,Swift 和 Objective-C 中还可以通过 protocol 和代理模式来实现更加灵活的扩展。
继承和多态。同其他语言一样,iOS 开发中我们可以将共同的方法和变量定义在父类中,在子类继承时再各自实现对应功能,做到代码复用的高效运作。同时针对不同情况可以调用不同子类,大大增加代码的灵活性。

三 Xcode 调试 LLDB 中 p 和 po 有什么区别?

关键词:#调试 #命令

p 是 expr – 的缩写。它做的工作是把接收到的参数在当前环境下编译,然后打印出对应的值。
po 是 expr –o– 的缩写。它所做的操作与 p 相同。如果接收到的参数是个指针,它会调用对象的 description 方法,并进行打印;如果是个 core foundation 对象,那么会调用 CFShow 方法,并进行打印。如果这两个方法都调用失败,po 打印出和 p 相同的内容。
总的来说 po 相对于 p 会打印出更多内容。一般工作中,用 p 即可,因为 p 操作较少效率较高。

四 如何优化APP启动时间?

减少动态库数量,dylib loading time 会下降,苹果的推荐是动态库不要多于 6 个
减少 Objective-C 的类数量,例如合并或者删除,这样可以加快动态链接,rebase/binding time 会下降
使用 initialize 方法替换 load 方法,或是尽量将 load 方法中的代码延后调用,initializer time 会下降

五 该怎样解决 EXC_BAD_ACCESS?

EXC_BAD_ACCESS 主要原因是访问了某些已经释放的对象,或者访问了它们已经释放的成员变量或方法。解决方法主要有以下几种:

设置全局断点快速定位 bug 所在,这种方法效果一般;
重写 object 的 respondsToSelector 方法,这种方法效果一般且要在每个 class 上进行定点排查,不推荐;
使用 Zombie 和 Address Sanitizer,可以在绝大多数情况下定位问题代码

6、iOS DeviceSupport -- ~/Library/Developer/Xcode/iOS DeviceSupport

竟占最多!我把10以下的都删除了。不过这个可重新生成!在连接旧设备调试时,会重新自动生成。

7、iPhone Simulator -- ~/Library/Application Support/iPhone Simulator
这个我只保留了最新的一套模拟器。这个删除后需要重新下载。

8、Archives -- ~/Library/Developer/Xcode/Archives
这个不可恢复;Adhoc或者App Store版本会被删除。建议备份dSYM文件夹

9、DerivedData -- ~/Library/Developer/Xcode/DerivedData
可重新生成;会删除build生成的项目索引、build输出以及日志。重新打开项目时会重新生成,大的项目会耗费一些时间。

以上是我删除的,根据OmniDiskSweeper扫描出的大小,只删除了这些我竟然清理出了40多G的空间。下面这些我没删。

10、模拟器的临时文件
可重新生成;如果需要保留较新版本的模拟器,但tmp文件夹很大。放心删吧,tmp文件夹里的内容是不重要的。在iOS Device中,存储空间不足时,tmp文件夹是可能被清空的。
路径:~/Library/Application Support/iPhone Simulator/6.1/tmp (以iOS Simulator 6.1为例)

11、移除模拟器中安装的Apps
影响:不可恢复;对应的模拟器中安装的Apps被清空了,如果不需要就删了吧。
路径:~/Library/Application Support/iPhone Simulator/6.1/Applications (以iOS Simulator 6.1为例)

12、移除旧的Docsets
影响:不可恢复;将删除旧的Docsets文档
路径:~/Library/Developer/Shared/Documentation/DocSets

相关文章

网友评论

      本文标题:10道一篇(一)

      本文链接:https://www.haomeiwen.com/subject/yfuhzftx.html