SET方法内存管理

SET方法内存管理

情况一:Person类中有一个属性car

-(void) setCar:(Car *) car{

  _car = car;   // line 1

}

这样做是不妥的,主方法中调用一下说明这个不妥:

Person * p = [[Person alloc]init];

Car * c = [[Car alloc]init];

p.car = c;  // 调用上面set方法中的line 1 ,因无alloc copy new ,故 虽然 _car 使用并指向了 Car对象,但对Car对象的retainCount并无影响!

[c release]; // Car对象retainCount 为 0 ,Car 对象消失

------此处,Person类对象还没消失,但其内的_car属性已无意义,因其所指的对象已经消失--------

[p release]

情况二:为改进情况一,修改set方法如下

-(void) setCar:(Car *) car{

  _car = [car retain];   // line 2

}

-(void)dealloc{

[_car release];  // 覆写dealloc方法,既然_car retain了一下Car对象,那么Person对象覆灭时候,作为其内属性的_car也应该release掉这次引用,这也是符合黄金法则的。

[super dealloc];

}

其意思是,既然_car要使用Car对象,就应该对Car对象做一次引用保留,增加一次retainCount,说明_car在这个属性在使用着Car对象。

但这样仍然是不完善的,主文件中调用一下说明这个不完善:

Person * p = [[Person alloc]init];

Car * c1 = [[Car alloc]init];

p.car = c1;  // c1的Car对象 引用计数为 2

Car * c2 = [[Car alloc]init];

p.car = c2;  // c2的Car对象 引用计数为 2。同时,_car 不再指向 c1的Car对象!

[c2 release]; // c2 retainCount 1

[c1 release]; // c1 retainCount 1

[p release];  // p覆灭,同时c2 retainCount 0; c1 retainCount 1,造成内存泄露

情况三:继续改进情况二

-(void) setCar:(Car *) car{

if(_car != car){

    [_car release];   // 如果_car有旧值,那么这一步会使其释放所保留其指向对象的引用;如果没有旧值,等效于 [nil release] 也无不可

    _car = [car retain];

}

}

时间: 2024-10-12 21:06:39

SET方法内存管理的相关文章

黑马程序员-内存管理之set方法内存管理

一.set方法内存管理 当一个对象拥有另一个对象的属性时,需要在set方法对当前所拥有的对象做retain操作,因为你的属性是指向了另一个对象,需要让另一个对象知道有单元在使用我. 但是这样写的话不够完善,会出现新的问题.如果对象属性之前已经指向了某一个对象了,此时再传进来一个新的对象,属性指针就指向了新的对象,然后retain了新的对象,但是旧的对象此时并没有人工release过,需要release一下.还有一个问题就是在release旧对象,retain新对象之前要做一个判断,判断一下此时拥

oc-set方法内存管理 和 @property的参数

想一个对象中 连续两次set某个对象,会造成先set的对象 没有release,造成内存没有释放. 1 /* 2 内存管理代码规范: 3 1.只要调用了alloc,必须有release(autorelease) 4 对象不是通过alloc产生的,就不需要release 5 6 2.set方法的代码规范 7 1> 基本数据类型:直接复制 8 - (void)setAge:(int)age 9 { 10 _age = age; 11 } 12 13 2> OC对象类型 14 - (void)set

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

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

多内存管理

1.有alloc,new,copy创建出来的对象就必须有release,在类中是retain对oc类型对成员在该类对dealloc方法中也要release 2.一旦对象直接有引用关系,那么就一定有retain,同时在主对象销毁时,也必须对其引用对对象release.但是对象引用时,在retain时 注意是否引用对时同一个对象,若是不同对象就得先release旧对象,再retain新对象 代码: -(void)setDog:Dog dog { if(dog!=_dog) { [_dog relea

iOS中内存管理

iOS中创建对象的步骤: 1,分配内存空间,存储对象 2,初始化成员变量 3,返回对象的指针地址 第一:非ARC机制: 1,对象在创建完成的同时,内部会自动创建一个引用计数器,是系统用来判断是否回收对象的唯一标示,当我们的应用计数retainCount = 0的时候,系统会回收当前对象2,[对象 release] retainCount - 1:3,[对象 retain] retailCount + 1:4,当应用计数retailCount = 0的对象就会被销毁; 5,dealloc函数,当一

黑马程序员___OC__内存管理

内存管理 引用计数器 当一个对象被创建出来,就要分配给内存这个对象,当不用这个对象的时候,就要及时的回收,为了可以明确知道对象有没有被使用,就要用引用计数器来体现,只要计数器不为0,表明对象被使用中. 1.方法的基本使用 1> retain :计数器+1,会返回对象本身 2> release :计数器-1,没有返回值 3> retainCount :获取当前的计数器 4> dealloc * 当一个对象要被回收的时候,就会调用 * 一定要调用[super dealloc],这句调用

oc内存管理总结(一)

**内存管理 问题 1.什么是ios内存管理? 就是在对象不再被使用的时候,把它即时的从内存中清除掉 2.为什么要使用内存管理? 1.严格的内存管理,能够是我们的应用程在性能上有很大的提高 2.如果忽略内存管理,可能导致应用占用内存过高,导致程序崩溃 3.系统判断一个对象是否要被销毁的依据是什么? 每个对象创建出来的时候,都有一个retainCount属性,默认值是1,当retainCount = 0的时候,系统就会将该对像销毁 4.如何使对象的retainCount 值增加? 调用retain

黑马程序员--Objective-C之--OC中的内存管理

对于面向对象的变成语言,程序需要不断地创建对象. 初始,创建的所有程序通常都有指针指向它,程序可能需要访问这些对象的实例变量或调用这些对象的方法,随着程序的不断执行,程序再次创建了一些新的对象, 而那些老的对象已经不会再被调用,也不再有指针指向他们,如果程序没有回收他们占用的内存,就会出现内存泄露. 如果程序一直泄露内存,那么可用内存就会越来越少,直到没有足够的内存,程序將会崩溃.目前,主要有两种管理内存的技术,一是引用计数,二是垃圾回收. iOS平台目前只支持引用计数,Mac平台支持垃圾回收.

操作系统内存管理——分区、页式、段式管理

计算存储的层次结构: 当前技术没有能够提供这样的存储器,因此大部分的计算机都有一个存储器层次结构,即少量的非常快速.昂贵.易变的高速缓存(cache):若干兆字节的中等速度.中等价格.易变的主存储器(RAM):数百兆或数千兆的低速.廉价.不易变的磁盘.这些资源的合理使用与否直接关系着系统的效率. 1. 内存管理方法 内存管理主要包括虚地址.地址变换.内存分配和回收.内存扩充.内存共享和保护等功能. 2. 连续分配存储管理方式 连续分配是指为一个用户程序分配连续的内存空间.连续分配有单一连续存储管