iOS--检测野指针

定位野指针除了使用Malloc Scribble(内存涂鸦)外,还可以使用僵尸对象。所谓的僵尸对象,就是将被释放的对象标记为僵尸,系统不会回收这些对象的内存,并让这些内存无法被重用,因而也就不会被覆写。

在启用“僵尸对象”后,在调试期间,如果对象被释放了,会被转化为“僵尸对象”。如果再向对象发送消息,则对应的“僵尸对象”会收到这个消息,并抛出异常。异常信息中会明确描述被释放的对象,以及接收的是哪个消息。

要开启僵尸对象,可以勾选“Edit scheme” -> "Diagnotics" -> “Enable Zombie Objects”,如图1所示。

我们通过一个简单的例子来对比一下开启僵尸对象前后程序的行为。代码如下所示,我们将array声明为一个__unsafe_unretained指针,其在赋值后会被立即释放,且不会被置为nil。

__unsafe_unretained NSMutableArray *arrayM = [[NSMutableArray alloc] init];
    [arrayM addObject:@"1"];
    [arrayM addObject:@"2"];
    
    NSLog(@"=%@",arrayM);

 

在未开启僵尸对象的情况下,程序能正常运行,并打印出数组。而如果开启了僵尸对象,则程序会崩溃,异常信息如图2所示。

 

 

posted @ 2016-07-11 10:52  越过三  阅读(2171)  评论(0编辑  收藏  举报