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

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;
}



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。