OC中内存管理问题之引用计数

定义一个Person类

其实引用计数这个问题大家可以理解为租房子的问题, 如果有retain alloc 代表这个人租了这间大房子, 拿到了一把钥匙, 引用计数代表房子一共有的钥匙的数量, release代表退房归还钥匙

Person * p = [[Person alloc] init];//房东盖好了一间房子, 现在是房东一个人

//alloc 开辟空间,引用计数由0变为1

//retainCount,用于查看对象的引用计数

NSLog(@"%lu", [p retainCount]);

Person * p1 = [p retain];// retain一次,
代表又来一个人租房

NSLog(@"p1 = %lu", [p1 retainCount]);//引用计数1-2

NSLog(@"%lu", [p retainCount]);//引用计数1-2

Person * p2 = p1;//没有retain 也没有alloc 引用计数不变. 就相当于p1带他的朋友来住,朋友没有钥匙的

//release 减少引用计数(归还钥匙)

[p release];//引用计数2-1

[p release];//引用计数1-0(但是如果我们去输出的话,
可能是会显示崩溃, 或者是1, 原因如下:)

NSLog(@"%lu",
[p retainCount]);// 首先这样写肯定是不对的
, 最后一次release,系统已经回收掉这块内存,空间已经还给系统,空间已经不归你管理,如果此时在访问,就访问了一块没有所有权的空间,所以下面的操作可能会出现野指针问题

我们还以上面的租房子问题为例, 现在这间房子最后一个人已经走了, 已经没有人住了, 按说钥匙已经全部交上去了, 但是我们现在的操作就像是又拿着他的钥匙去开那个门, 这是非常不安全的.那为什么有时候会崩溃而有时候可以打印出1呢, 这是因为如果这块内存别人还没有使用, 就像是房子还没有租出去, 你再回去拿钥匙开门还是安全的,
但是如果这间房子又已经租出去, 即已经有别的数据在使用这块内存, 那你再回去开门, 那你的处境是相当的不安全有木有???

[p
release];//野指针问题 +过渡释放,这个也很好理解,
大家可以理解成有房客拿一把钥匙, 不但要开门, 还要拿着这个钥匙再去归还一次, 要房东再次退房子押金, 违法了, 直接崩~

内存问题其实除了上面提到的野指针和过度释放, 还有一个, 那就是内存泄露, 内存泄露我们可以理解为, 一为租客租房子最后钥匙没有归还, 这样房东也没有办法打开这间房子, 这间房子就没有办法再租出去, 导致内存浪费, 当然, 房东在有别的房子出租的时候, 对于他来讲并没有太大的影响, 但是一旦这样的房客有好多,房子不够租, 房东挣钱会越来越慢,
最终可能导致做不下去~

本文只是个人对内存引用计数的一些理解 有什么不对的地方, 大家多多指出~

时间: 2024-10-28 09:21:58

OC中内存管理问题之引用计数的相关文章

简述OC中内存管理机制

1.OC的内存管理机制是引用计数, 内存管理原则是谁开辟谁释放, 有retain就要有release. 2. 分为ARC(自动引用计数)和MRC(非自动引用计数), 在MRC下, 我们需要手动管理内存,需要使用到retain/copy/release/autorelease等方法实现内存管理, ARC下一般不需要程序员手动管理内存, 系统会为程序添加自动释放池以实现内存管理, 当然, 咱们说的一般不需要不能理解为完全不需要考虑内存问题, 比如在解决block循环引用问题的时候, 就需要使用__w

简述OC中内存管理机制。

1        简述OC中内存管理机制.与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwrite,readonly,assign,retain,copy,nonatomic .atomic.strong.weak属性的作用? OC使用了一种叫做引用计数的机制来管理对象,如果对一个对象使用了alloc.[Mutable]copy,retain,那么你必须使用相应的realease或者aut

OC17内存管理和自动引用计数

// //  ViewController.m //  OC17内存管理和自动引用计数 // //  Created by Zoujie on 15/10/25. //  Copyright ? 2015年 Zoujie. All rights reserved. // #import "ViewController.h" #import "Fraction.h" @interface ViewController () @end @implementation V

cocos2dx中的内存管理机制及引用计数

1.内存管理的两大策略: 谁申请,谁释放原则(类似于,谁污染了内存,最后由谁来清理内存)--------->适用于过程性函数 引用计数原则(创建时,引用数为1,每引用一次,计数加1,调用结束时,引用计数减1,当引用计数为0时,才会真正释放内存) --------->适用于注册性函数(消息处理,中断等场合) 2.cocos2dx中的内存管理采用引用计数和内存托管的原则 spr->retainCount();//获取对象的引用计数值 spr->retain();//引用计数加1 spr

OC基础15:内存管理和自动引用计数

1.什么是ARC? (1).ARC全名为Automatic Reference Counting,即是自动引用计数,会自动统计内存中对象的引用数,并在适当时候自动释放对象: (2).在工程中使用ARC非常简单:只需要像往常那样编写代码,只不过永远不用写retain. release和autorelease三个关键字: (3).在使用ARC之前,需要手动管理内存计数,这种机制称为MRC,即是手动引用计数 (Manual Referecen Counting): (4).ARC是Objective-

OC中内存管理(转)

OC内存管理 一.基本原理 (一)为什么要进行内存管理. 由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等. 管理范围:任何继承NSObject的对象,对其他的基本数据类型无效. 本质原因是因为对象和其他数据类型在系统中的存储空间不一样,其它局部变量主要存放于栈中,而对象存储于堆中,当代码块结束时这个代码块中涉及的所有局部变量会被回收,指向对象的指针也

第九讲.内存管理初级.(内存管理的方式,引用计数机制及影响计数的各个方法,dealloc方法,内存管理的基本原则,掌握copy的实现)

一.内存管理的方式. 1.进行内存管理的原因: 1>.由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等. 管理范围:任何继承NSObject的对象,对其他的基本数据类型无效. 2>.本质原因是因为对象和其他数据类型在系统中的存储空间不一样,其它局部变量主要存放于栈中,而对象存储于堆中,当代码块结束时这个代码块中涉及的所有局部变量会被回收,指向对象的指

OC中内存管理

内存管理: 谁retain ,谁release 谁alloc ,谁release 每一个对象在创建时都会创建一个引用计数器,系统会根据引用计数器判断对象需要不需要被回收 对象在创建时引用计数器是1 当调用retain消息 计数器 +1   返回对象本身 当调用release消息 计数器 -1 retainCount 获取计数器 当对象的计数器变0之后,当前对象就变成僵尸对象(野指针) 对象在被销毁时,系统会发送一条dealloc消息 1> 一般都会重写dealloc方法,在这里释放相关资源,所有

OC --(9)-- 内存管理初级:内存管理的方式、引用计数机制,影响计数的各个方法、dealloc方法、内存管理的基本原则、掌握copy的实现

iOS应?程序出现Crash(闪退),90%以上的原因是内存问题. 在一个拥有数十个甚?至是上百个类的?程里,查找内存问题极其困难. 了解内存常?问题,能帮我们减少出错几率. 内存问题体现在两个方面:内存溢出.野指针异常. 1.野指针异常 内存管理的方式 引用计数 影响引用计数的方法有 +alloc -retain -copy -release -autorelease