美文网首页
<编写高质量iOS代码的52个方法>

<编写高质量iOS代码的52个方法>

作者: 今晚煮面 | 来源:发表于2021-02-24 11:58 被阅读0次

1,c语言+面向对象的特效 = ojective-c;ojective-c是c的超集,说明所有c的东西在ojective-c这里都成立,都适用。

2,ojective-c使用动态绑定的消息结构,在运行时才会检查对象类型,而其他的非面向对象的语言,是在编译器去做这个事情的。

3,用字面量语法来创建数组或字典时,若值中有nil,则会抛出异常,因此务必确保值里不含nil。

4,用static修饰符则意味着该变量仅在定义此变量的编译单元中可见。也就是只在当前的文件中可见,当前的文件编译后是一个编译单元。

5,不要用预处理指令定义常量,这样定义出来的常量不含类性信息,编译器只是会在编译前据此执行查找和替换操作,即使有人重新定义了常量值,编译器也不会产生警告信息,这样导致应用中的常量信息不一致。

6,在实现文件中使用static const来定义只在编译单元中可见的常量,由于此类常量不在全局符号表中,所以无需为其名称添加前缀。

7,在头文件中使用extern来声明全局常量,并在相关文件中定义其值。这种常量要出现在全局符号表中,所以其名称需要加以区别,通常用与之相关的类名做前缀。

8,如果在一个类中,这个类需要作为类中某个对象的代理,那么这个类在别的类中出现的时候,一定要用strong修饰,一定要拥有它,要不然你在那个类不拥有它的话,你初始化完它后,它就销毁了,它就没有办法做别人的代理了,我今天在优化弹框地图导航的代码时就是这样,本来以为可以不用strong修饰,直接初始化就用,但是结果我点击导航的时候,根本不走里面的那个actionsheet的代理方法,原因就是因为我没有用strong修饰,然后初始化完了它也就自己销毁了,没能作为actionsheet的代理,就不走代理方法,就没办法正常跳转到地图app去导航,这个往后的代码中要注意,什么时候需要用strong修饰符修饰,什么时候可以不用,一般有事件的话还是需要用的,单纯的弹框展示的话,估计不用也没事的。

9,可以通过“关联对象”机制把两个不能通过继承关系链接在一起的对象链接起来,当然这个是用到了运行时的方法了。并且可以指定内存管理语义,像属性那样的拥有和非拥有关系。

10,动态语言和静态语言的差别就在于,是在编译期就知道调用一个函数还是要等到运行的时候才知道。像oc这样的就是动态语言,像对象的类型都是要等到运行时才能知道呢。

11,在动态语言中,你在编译期向类发送了无法解读的消息并不会报错,因为在运行时还可以继续向类中添加方法,所以在编译期类是不能知道类中到底会不会有某个方法实现。

12,若对象无法响应某个选择子,则进入消息转发流程;通过运行期的动态方法解析功能,我们可以在需要用到某个方法的时候再将其加入类中;对象可以把其无法解读的某些选择子转交给其他对象来处理;如果前面的步骤都不能处理选择子,那就启动完整的消息转发机制。

13,在运行期,可以向类中新增或者替换选择子所对应的方法实现;使用另一份实现来替换原有的方法实现,这叫做方法调配(exchangeimplement),这种技术可以向原实现中添加新功能;不过一般这种技术只有程序调试的时候会用,一般不要去尝试更改已经有的方法实现,滥用了后果不太好。

14,尽量使用类型信息查询方法来确定对象类型而不是直接比较类对象,因为某些对象可能实现了消息转发功能;假如a对象实现了消息转发,它把所有收到的选择子都转发(代理)给了对象b,这个时候a叫发起代理的对象,b为接受代理的对象,如果在a上直接调用[a class]这个方法,它返回的就是a对象的类型,如果调用[a iskindofclass]这个方法,它返回的就是b对象的对象类型,结果是不同的,所以尽量用类型信息查询。

15,深拷贝就是把容器和内容一起拷贝过去,而浅拷贝就是只拷贝了容器对象本身;Foundation框架中的所有collection类在默认情况下都执行浅拷贝,也就是说只拷贝容器对象本身,而不复制其中数据。

16,使用分类机制把类的实现代码划分为易于管理的小块。这样的代码看起来比较清晰明了,模块功能之间也有很好的隔离。

17,属性是用来封装数据的,分类主要是用来对类进行扩展的,所以在分类里尽量不要定义属性,但是你可以定义存取方法。

18,autorelease能延长对象生命周期,使其在跨越方法调用边界后依然可以存活一段时间。

19,ARC在调用release, retain等方法时,并不是像我们oc的消息派发机制,而是直接调用其底层的c语言版本,因为保留和释放操作会频繁执行,直接调用底层可以节省很多cpu周期,这样性能更好。

20,ARC只负责管理OC对象的内存,尤其注意:CoreFoundation对象不归ARC管理,开发者必须适时调用CFRetain/CFRelease。

21,Block可以使用在它定义的范围内的所有变量。但是,如果你想在block内部改变一个外部的变量,你就要在变量定义的时候加上__block,这样定义的变量才能在block内部修改,否则编译器会报错的哦。

22,Block块可以分配在栈上,也可以分配在堆上,还可以是全局的(相当于单例);不过默认的是在栈上,如果有需要,可以把它拷贝到堆上,这样的话,这个块就跟oc的对象一样,具备引用计数了。

23,performSelector系列方法在内存管理方面容易有缺失,它无法确定将要执行的选择子是什么,所以ARC就不知道应该在什么时候添加适当的内存管理方法。同时这些方法能处理的选择子,返回值,参数个数都有限制,所以尽量使用GCD的相关方法代替。

24,

相关文章

网友评论

      本文标题:<编写高质量iOS代码的52个方法>

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