总结:
1,当栈区的指向对象的局部变量随着代码块的结束,而被释放;那么,对象就没有了强指针引用了,所以也被释放。
2,当对象被指定为__week的弱指针时,对象也被释放。
Car *car = [[Car alloc] init];
car = nil; // 此处执行完毕,car对象被回收
car.speed = 10; //不会报错,也不是僵尸对象,所以检测僵尸对象也检测不出来
__weak Car *car2 = car; //弱指针,执行这行代码就被释放
//---------------------ARC与多对象的内存管理
@property (weak,nonatomic) Dog *dog;
Person *p = [Person new];
Dog *d = [Dog new];
p.dog = d;
d = nil; // 此句执行后,狗立即被释放
@property (strong,nonatomic) Dog *dog;
{
d = nil; // 此句执行后,没被释放
}//-----> 此处执行完后再被释放
//--------------------ARC下循环引用问题
两个强指针一旦相互引用,会造成无法释放
解决方案:
循环引入的对象中其中一个对象设置为strong 另一个设置为weak
//------------------ARC下@property参数
ARC中的@property
strong : 用于OC对象, 相当于MRC中的retain
weak : 用于OC对象,释放了之后,会将指针置为nil, 其他相当于MRC中的assign
assign : 用于基本数据类型, 跟MRC中的assign一样
copy : 一般用于NSString, 跟MRC中的copy一样
在ARC情况下解决”循环retain”的问题:@property一边用strong,一边用weak。
//------------------ARC的兼容和转换
|
|