美文网首页
编写高质量的代码:改善Objective-C程序的61个建议(读

编写高质量的代码:改善Objective-C程序的61个建议(读

作者: bc3d3e66fba3 | 来源:发表于2016-11-30 23:15 被阅读41次

       最近这几天,一直在加班,九点多下班,但是,今天我并不觉得累,感觉还很精神,黑夜给了我静谧,让我有时间能够思考,能够静下来去读一些东西,写一些东西,所以我很喜欢这个时间段,让我有时间去总结这几天的学习。好了,接下来,我就把这几天读的做个总结。

喜欢这样的夜晚

     建议9:高度警惕空指针和野指针的袭击。

     空指针就是没有存储任何内存地址的指针,被赋值为0的指针。野指针是指向“垃圾”内存的指针,不是NULL指针,野指针是非常危险的。

(1)空指针(NULL指针),是指没有存储任何内存地址的指针。野指针,是指向“垃圾内存”(不可用内存)的指针。

(2)利用野指针发消息是很危险的,会报错。也就是说,如果一个对象已经被回收了,就不要再去操作它,不要再尝试给它发消息。

(3)利用空指针发消息是没有任何问题的,也就是说代码是没有错误的。

建议10:在64环境下尽可能利用标记指针

   标记指针是指那些指针中包含特殊属性或信息的指针。标记指针一个比较典型的应用就是NSNumber.在64位环境下,对于一般的数字,NSNumber不用再分配内存了。

NSNumber *number3 =@3;

NSNumber *number4 =@4;

NSNumber *number9 = @9;

NSLog(@"number3 pointer is %p",number3);

NSLog(@"number4 pointer is %p",number4);

NSLog(@"number9 pointer is %p",number9);

在64模拟器中运行后,结果如下:

number3 pointer is 0xb000000000000032

number4 pointer is 0xb000000000000042

number9 pointer is 0xb000000000000092

可以看出number3,number4和number9的值前4位都是0xb,后位都是0x2(指针的tag),中间就是实际的取值。因此,这些NSNumber已经不需要再分配内存(指堆中内存)了,直接可以把实际的值保存到指针中,而无须再访问堆中的数据,这无疑提高了内存访问速度和整体运行速度。

如果NSNumber超出了标记指针所能表示的范围,系统会自动采用分配成对象,可以根据指针的最后4位是否为0区分。

NSNumber *numberBig =@(0x1234567890ABCDEF);

NSLog(@"numberBig pointer is %p",numberBig);

在64位模拟器中运行后,结果如下:

numberBig pointer is 0x1094026a0

可以看出numberBig指针最后4位都是0,应该是分配在堆中的对象。因此,如果NSNumber超出了标记指针所表示的范围,系统会自动采用分配成对象,可以根据指针的最后4位是否是0来区分。

(1)利用标记指针,可以在指针中保存或附加更多的信息。

(2)利用标记指针处理NSNumber,直接可以把实际的值保存到指针中,而无须再去访问堆中的数据,可以提高内存访问速度和整体运算速度。

(3)在32位和64位的环境下,isa指针会产生不同的变化。在64环境下,标记指针可加快isa指针的处理效率。

   ok,今天总结了两点,从中还是学到了很多,不知不觉,已经十一点多了,马上要休息了,如果文中有错误,望积极指出,谢谢!

相关文章

网友评论

      本文标题:编写高质量的代码:改善Objective-C程序的61个建议(读

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