iOS APP 开发 OC 第十八天,Wild Pointer 如何火化殭屍?如何将殭屍复活?

tags: OC 30 day

Wild Pointer 是什麽?

野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)指针变量在定义时如果未初始化,其值是随机的,指针变量的值是别的变量的地址,意味着指针指向了一个地址是不确定的变量,此时去解引用就是去访问了一个不确定的地址,所以结果是不可知的。

C语言中的Wild Pointer:

定义一个指针变量,没有初始化,这个指针变量的值是一个垃圾值,指向一个随机空间,这个指针叫做wild Pointer。

OC中的Wild Pointer:

指针指向的对象已经被回收了。这样的只知叫做wild Pointer。

对象回收的本质

内存回收的本质:
申请一个变量,实际下就是向系统申请指定字节数空间的。这些空间系统就不会再分配给别人了。

当变量被回收的时候,代表变量占用的字节空间从此以後系统可以分配给别人使用了。
但是字节空间中储存的资料还在,

回收对象:
所谓的对象回收,指的是对象占用的空间可以分配给别人。
当这个对象占用的空间没有分配给别人之前,其实对象数据还在。

监於以上的知识,请看下面这段程序码。

int main(int argc, char * argv[]) {
    @autoreleasepool {
        Person *p1 = [[Person alloc]init];
        p1.name = @"猴子";
        NSUInteger count = [p1 retainCount];
        NSLog(@"count = %lu",count);
        [p1 release];
        [p1 message];
    }
}

这对程序码会不会crash?

Zombie Objects

一个已经被释放的对象,但是这个对象所占的空间还没有分配给别人,这样的对象叫做zombie objects。我们透过wild pointer去访问zombie objects 的时候。有可能没问题,也有可能会有问题。当殭屍对象占用的空间还没有分配给别人的时候,这是可以的。
当殭屍对象占用的空间分配给别人使用的时候,就不可以。

我们认为只要对象成为了Zombie Objects,无论如何都不要访问了

就希望如果访问的是Zombie Objects,无论如何报错。
Zombie Objects实时检查机制,可以将这个机制打开。打开之後,只要访问殭屍对象,无论空间是否分配,就会报错。

在edit scheme 里面选取run -> Diagnostics 打开 Zombie Objects

为什麽不默认打开Zombie Objects对象检测?

一但打开Zombie Objects检测,那麽在每访问一个对象的时候,都会先检查这个对象是否为一个Zombie Objects对象。这样是极其消耗性能的。

使用wild pointer 访问 zombie objects就会报错,如何避免zombie objects 对象错误。

当一个指针称为野指针以後,将这个指针的值设为nil。

int main(int argc, char * argv[]) {
    @autoreleasepool {
        Person *p1 = [[Person alloc]init];
        p1.name = @"猴子";
        NSUInteger count = [p1 retainCount];
        NSLog(@"count = %lu",count);
        [p1 release];
        p1 = nil;
        [p1 message];
    }
}

当一个指针的值为nil,通过这个指针去调用对象发法的时候(包括点语法),不会报错。只是没有任何反应。但是如果直接访问属性,就会报错。

殭屍复活

以下程序码是无法使用的,因为殭屍是无法复活的,因为他已经火化了。

int main(int argc, char * argv[]) {
    @autoreleasepool {
        Person *p1 = [[Person alloc]init];
        p1.name = @"猴子";
        NSUInteger count = [p1 retainCount];
        NSLog(@"count = %lu",count);
        [p1 release];
        
        [p1 retain];

    }
}

<<:  [JS] You Don't Know JavaScript [Async & Performance] - callbacks

>>:  详解资料仓库的实施步骤,实战全解!(1)

lejos ev3 (ev3 使用 java 完整攻略) - jerry Tsai

Ev3 是 LEGO® MINDSTORMS® 乐高公司发展的可程序机器人,有原生的专用语法,且可使...

Day17:【技术篇】SQL之其它常用语法

一、前言   上一篇文章有稍微带到简单的SQL基本CRUD操作方式,但实际玩起来我觉得就和GIT一样...

【Day1】简介

这边主要是由於之前想说把上班的东西一部分能公开的拿来当铁人赛的内容,顺便鞭策 自己能往相关领域深入,...

Day-25 事件机制(1)

在网页中的JavaScript程序码,必须经由事件触发(如:按下按钮,又称事件驱动event-dri...

30天零负担轻松学会制作APP介面及设计【DAY 03】

大家好,我是YIYI,今天我要来介绍规格表。 关於规格表 规格表可以帮助大家快速地了解到你所想制作的...