OC系列高级-内存管理二
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OC系列高级-内存管理二相关的知识,希望对你有一定的参考价值。
一.MRC模式下set和get方法
首先我们创建一个Dog类
Dog.h:
#import <Foundation/Foundation.h> @interface Dog : NSObject @property (assign) int ID; @end
Dog.m:
#import "Dog.h" @implementation Dog @synthesize ID = _ID; - (void)dealloc{ NSLog(@"Dog ID%d is death",_ID); [super dealloc]; } @end
再创建一饿Person类
Person.h:
#import <Foundation/Foundation.h> #import "Dog.h" @interface Person : NSObject { Dog *_dog; } -(void)setDog:(Dog *)newDog; -(Dog *)dog; @end
Person.m:
#import "Person.h" @implementation Person -(void)setDog:(Dog *)newDog{ NSLog(@"%d",_dog.retainCount); if(_dog != newDog){ [_dog release]; _dog = nil; NSLog(@"%d",_dog.retainCount); _dog = [newDog retain]; NSLog(@"%d",_dog.retainCount); } } -(Dog *)dog{ return [_dog autorelease]; } - (void)dealloc { NSLog(@"Person is death"); [super dealloc]; } @end
在main函数中我们创建两个dog,并且创建person
Dog *dog1 = [[Dog alloc]init]; dog1.ID = 1; Dog *dog2 = [[Dog alloc]init]; dog2.ID = 2; Person *p = [[Person alloc]init];
person set一个dog
[p setDog:dog1];
此时,set方法完之后dog.retainCount值为2,因为dog创建和retain
当我们把dog1 release操作
[dog1 release]; NSLog(@"%d",dog1.retainCount); //值为1
NSLog(@"%zd",p.retainCount); //person的retainCount值为1,因为只是创建
我们把person release操作
[p release]; p = nil;
此时person retainCount值为0,并且调用了dealloc方法,但是person里的dog的retainCount值为1;所以我们在回收person时要把它的对象属性release操作,要不会引起内存空间的泄漏
当person没有执行release操作,再set一个dog1操作,此时,person的dog的retainCount值为1,即没有进行retain操作
注意点:
1.析构函数的release时一定要release掉包含的对象
以上是关于OC系列高级-内存管理二的主要内容,如果未能解决你的问题,请参考以下文章