iOS复习笔记7:循环引用问题
@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; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。