iOS-《编写高质量代码》笔记-第二章
建议8:C语基本言与Objective-C 语言的关系是充分而非必要条件
1.C 语言的基本语法在Objective-C 语言中是可用的。
2.与C语言相比,Objective-C语言又定义了新的基本数据类型,如BOOL等。
3.Objective-C值对象比C类型变量具有封装常用操作的优势,但在数值计算中,使用C类型标量更为简洁。
建议9:高度警惕空指针和野指针的袭击
1.空指针(NULL 指针),是指没有存储任何内存地址的指针。野指针,是指向“垃圾内存”(不可用内存)的指针。野指针指向的对象被释放了,无指向的指针是空指针。
2.利用野指针发消息是很危险的,会报错。也就是说,如果一个对象已经被回收了,就不要再去操作它,不要再尝试给它发消息。
3.利用空指针发消息是没有任何问题的,也就是说代码是没有错误的。
建议10:在64位环境下尽可能利用标记指针
iphone 5s 采用了arm 64 的cpu.
由于指针地址对齐概念和64位超大地址的出现,指针地址仅仅作为内存的地址是比较浪费的,故此,可以在指针地址中保存或附加更多信息。这就引入了标记(Tagged)指针概念。标记(Tsgged)指针是指那些指针中包含特殊属性或信息的指针。其中指针对齐概念可以来标识一个指针是否是标记指针及相关类型。(指针对齐 地址后四位都是0)
在64位环境下,isa也是64位,实际作为指针部分只用到其中的33位,剩余的部分会运用到标记(Tagged)指针的概念。其中19位将保存对象的引用计数,这样对引用计数的操作只需要原子的修改这个指针即可。如果引用计数超出19位,才会将引用计数保存到外部表,而这种情况往往是很少的,因此效率将会大大提高。
1.利用标记指针,可以在指针地址中保存或附加更多信息
2.利用标记指针处理NSNumber,直接可以把实际的值保存到指针中,而无须再去访问堆中的数据,可提高内存访问速度和整体运算速度。
3.在32位和64位的环境下,isa 指针会产生不同的变化。在64位环境下,标记指针可加快isa指针的处理效率。
建议11:谨记兼容32位和64位环境下代码编写事项
1.不要将长整型数据赋予整型
2.利用NSInteger 来处理32位和64位之间的转换
3.创建数据结构要注意固定大小和对齐
建议12:清楚常量字符串和一般字符串的区别
常量字符串 NSString *str = @“hello”;
1.由于编译器的优化,相同内容的常量字符串的地址值是完全相同的。
2.如果使用常量字符串来初始化一个字符串,那么这个字符串的地址值也是相同的。
3.对常量字符串永远不要release。release也没用。
建议13:在访问集合时要优先考虑使用快速枚举
使用快速枚举可以很容易地枚举集合,在快速枚举集合期间,不能变异集合,即使集合是可变的。如果在循环内,尝试添加或删除集合的对象,则会生成运行时异常。
建议14:有序对象适宜存于数组,而无序对象适宜存于集
1. 数组可维持持续性,故适宜存储有序的对象。集不维持秩序,故适宜存储无序对象,即使不止一次在集中尝试添加一个对象,集也只能存储一个单独对象的一个引用。
2.同一数组可以保存不同的对象,但不能存储基本类型和nil, 存储基本类型都会被设置成0,不能存储nil是因为数组必须用nil 来结尾
建议15:存在公共键时,字典是在对象之间传递信息的绝佳方式
字典可作为有序对象的集合,主要依赖于键值可采用有序。
建议16:明智而审慎地使用BOOL 类型
整型转换为BOOL型的时候要避免直接和YES做比较。