野指针是让人非常淡疼的一件事,遇到这种问题,人品好的时候程序正常运行,人品差的时候隔三差五的Crash,还不好找,也就是说,它是随机的。
所以在调试阶段,我们需要一种方法,让这种随机变成不随机。Xcode正好为我们提供了这样一种方法。在Edit scheme -> Run/Test -> Diagnostics中选中Enable Malloc Scribble,我们开启Malloc Scribble(内存涂鸦)。
Malloc Scribble的基本思想是,在对象被释放后,在对应内存块中填上不可访问的无意义的数据(0x55),那么我们再使用这个对象时,程序将直接Crash。
我们做个简单的测试,可以看到编译器会给个警告:Assigning retained object to unsafe_unretained variable; object will be released after assignment,也就是说在赋值后�array对象就会被释放。而同时因为不会被置为nil(__unsafe_unretained),所以就成了一个野指针。
在不开启Malloc Scribble时,能正常打印出日志;而在开启Malloc Scribble时,程序会直接崩溃
EXC_BAD_ACCESS内存访问错误。我们用memory read命令来查看一下array对象的内存,如图4所示。
可以看到array的内存块都已用0x55填充了