涉及到内存管理问题的都是类类型的变量,而在OC中我们操纵这些对象都是通过操纵指向他们的指针来完成的,一致很多时候会忽略指针存在。比如定义UIView * view = [[UIView alloc]init];然后我们会使用view这个指针来做许多的操作。而由指针带来的一个性质是,当view == nil的时候,是指view这个指针没有指向任何地方,不能代表view指向地方的值是空的。同样当view不为nil的时候,值说明它指向了一个地方,而不能说明它指向的地方有值。僵尸指针就是这样情况,比如:

 UIView * view1 = [[UIView alloc]init];
UIView * view2 = view1; //view1与view2 指向同一个对象内存地址
[view1 release]; //View1指向对象的引用计数为0,对象销毁
[view2 setxxx]; //view1与view2指向的对象此时已销毁,出现野指针,程序崩溃

如果view1 dealloc(销毁)了,内存没了,这时view2依然指向原来的地方,因为指针保存的是指向内存的地址,所以view2不是空的,但view2指向的地方是空的,这时view2就叫僵尸指针(看起来是“活的”,其实已经“死了”)。这时对view2做任何操作,就会程序崩溃。而且最糟糕的事情是,你好不能判断这时view2指向的地方是否内存释放了,因为你根本就不能调用view2。所以除了内存管理上做好之外,还有一个要注意的是释放掉一个内存后,如果这个指针还需要,要么赋新值,要么给个nil。

OC中的野指针(僵尸指针)的更多相关文章

  1. OC中的野指针,空指针,nil,Nil,NULL,NSNULL小结

    周末与一个老朋友吃饭聊天,因为他正在培训班学习iOS开发,就随便聊了几句,发现自己OC基础上的欠缺和一些知识点的混淆.特此整理如下. 1.空指针 没有存储任何内存地址的指针就称为空指针(NULL指针) ...

  2. OC中的指针

    NSError *err = nil; NSError __strong **error = &err; //因为在oc中,通过* *err 创建的指针是用__strong修改的,所以要一致, ...

  3. OC中的self指针

    在OC中,self是一个指针,方法和属性可以通过self.function进行访问:成员变量使用self->变量名进行访问.调用方法还可以用[self function]; OC中的self有点 ...

  4. iOS 关于僵尸对象和僵尸指针的那些事儿

    引言 提到僵尸就感到一种恐怖,大家都知道“僵尸”是没有生命的,但是它确实是一种存在的类似生命体的一种生物.哈哈,当然本文的重点不是讨论“僵尸”,而是有关于ios当中经常遇到的僵尸指针(Zombie P ...

  5. 智能指针 与 oc中的指针

     智能指针 与 oc中的指针 智能指针的原理及实现 当类中有指针成员时,一般有两种方式来管理指针成员:一是采用值型的方式管理,每个类对象都保留一份指针指向的对象的拷贝:另一种更优雅的方式是使用智能指针 ...

  6. [BS-21] 关于OC中对象与指针的思考

    关于OC中对象与指针的思考 1. 创建对象: OC中可通过代码Person *p = [[Person alloc] init];创建了一个对象p.该过程中内存情况为: 在当前线程的栈(默认1M)中, ...

  7. C++的空指针、野指针和指针赋值NULL.md

    1.空指针和野指针 http://blog.csdn.net/fu_zk/article/details/21030607 空指针常量 一个表示0值的整数常量,叫做空指针常量.例如:0.0L.1-1( ...

  8. C语言中指针的指针是如何工作的?

      我们有时看到这样地饿代码: int *ptr = &x; 这里,ptr是一个指向x在内存中的地址的指针. 假设有另外一条语句是这样地的: int **ptr2 = &ptr; 我们 ...

  9. 从汇编看c++中指向成员变量的指针(二)

    在从汇编看c++中指向成员变量的指针(一)中讨论的情形没有虚拟继承,下面来看看,当加入了虚拟继承的时候,指向成员变量的指针有什么变化. 下面是c++源码: #include <iostream& ...

随机推荐

  1. VS 2015 update2 装xamarin后,编辑axml文件无智能提示的解决方法。

    1.从github网上下载xsd文件.地址:https://github.com/atsushieno/monodroid-schema-gen: 2.如果你是以ie或edge浏览器下载的,一定要又键 ...

  2. SQL Cursor 基本用法

     1 table1结构如下  2 id    int  3 name  varchar(50)  4   5 declare @id int  6 declare @name varchar(50) ...

  3. java io 流基础

  4. PHP获取文件行数

    原文出处 提供两种实现方法,但是第一种效率最好 第一种: <?php $file_path = 'test.txt'; //文件路径 此处找一个1094644行的TXT文件 test.txt $ ...

  5. retain two decimal digits.

    package kju.o; import static kju.print.Printer.*; import java.text.*; class MathDemo { public static ...

  6. 分离数据库(Detach database).

    Many times, we often needs to detach our databases if we want to copy it to another database instanc ...

  7. c#中使用数据读取器读取查询结果

    今天有时间了. 在看<c#数据库入门经典> ,总结数据读取器查询结果. 针对单个结果集使用读取器,有3中方法: String connString =..; String sql =@&q ...

  8. 【转】iOS-Core-Animation-Advanced-Techniques(五)

    原文:http://www.cocoachina.com/ios/20150105/10829.html 图层时间和缓冲 图层时间 时间和空间最大的区别在于,时间不能被复用 -- 弗斯特梅里克 在上面 ...

  9. iOS RC4加解密算法

    -(NSString *)encrypt:(NSString *)string withKey:(NSString *)key{ self.sBox = [[self frameSBox:key] m ...

  10. Visual Studio2010 安装msdn

    1.注册VS2010 断网(不要冒险)->运行Microsoft Visual Studio 2010->帮助->注册产品->YCFHQ-9DWCY-DKV88-T2TMH-G ...