码迷,mamicode.com
首页 > 移动开发 > 详细

iOS复习笔记7:循环引用问题

时间:2015-01-29 17:42:56      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:objective-c   ios   内存管理   循环引用   

1 @class
@class ClassName,仅仅告诉编辑器ClassName是一个类


避免循环拷贝
在.h中使用@class声明
在.m文件中import头文件


2 循环引用问题
2.1 定义:
指两个对象互相retain对方,通过release是无法销毁这两个对象

2.2 描述:
比如在main函数中创建了两个类的对象A和B,现在引用计数都是1。
现在让A和B互相引用,两个对象的引用计数都增加了1,都变成了2。
执行[A release];[B  release];main函数就释放了自己的对象,但A和B互相引用,引用计数都还是1。
这时A和B将无法释放,因为要想释放A必须先释放B,在B的dealloc方法中再释放A。
同理,要想释放B必须先释放A,在A的dealloc方法中再释放B。
所以这两个对象将一直存在在内存中而不释放,这就是循环引用问题。


2.3 解决方案
一般的可以将短生命周期的引用属性设置为assign。或者A,B都设置为assign


循环引用示例:
// Person.h
@class Car


@interface Person


@property(noatomic, retain) Car* car; 


@end

// Person.m
#import "Person.h"


@implementation Person


- (void)dealloc
{
	[_car release];
	_car = nil;


	[super dealloc];
}


@end


// Car.h
@class Person


@interface Car


@property(noatomic, retain) Person* person; 


@end


// Car.m
#import "Car.h"


@implementation Car


- (void)dealloc
{
	[_person release];


	[super dealloc];
}


@end


// main.m
#import "Car.h"
#import "Person.h"


int main()
{
	Person* person = [[Person alloc] init];// person 1
	Car* car = [[Car alloc] init];// car 1
	person.car = car;// car 2
	car.person = person;// person 2
	[car release];// car 1
	[person release];// person 1


	return 0;
}



解决示例:
// Car.h
@class Person


@interface Car


@property(noatomic, assign) Person* person; 


@end



// Car.m
#import "Car.h"


@implementation Car


- (void)dealloc
{
	[super dealloc];
}


@end


// main.m
#import "Car.h"
#import "Person.h"

int main()
{
	Person* person = [[Person alloc] init];// person 1
	Car* car = [[Car alloc] init];// car 1
	person.car = car;// car 2
	car.person = person;// person 1
	[car release];// car 1
	[person release];// person 0,car 0

	return 0;
}



iOS复习笔记7:循环引用问题

标签:objective-c   ios   内存管理   循环引用   

原文地址:http://blog.csdn.net/xufeng0991/article/details/43273045

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!