A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 会飞得猪 中级黑马   /  2016-2-19 23:13  /  585 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

总结:
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的兼容和转换

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马