最近这几天,一直在加班,九点多下班,但是,今天我并不觉得累,感觉还很精神,黑夜给了我静谧,让我有时间能够思考,能够静下来去读一些东西,写一些东西,所以我很喜欢这个时间段,让我有时间去总结这几天的学习。好了,接下来,我就把这几天读的做个总结。
喜欢这样的夜晚建议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,今天总结了两点,从中还是学到了很多,不知不觉,已经十一点多了,马上要休息了,如果文中有错误,望积极指出,谢谢!
网友评论