解决循环引用问题

KVC
key:只能访问当前对象的属性
keyPath:包含了key的功能,能利用运算符一层一层的往内部访问属性
KVO:监听对象属性的改变
栈内存不区分强指针和弱指针。在栈内存中,只要大括号销毁,内存也随之销毁。在对空间,分强指针和弱指针。在栈内存中相当于浅copy在对空间中相当于深copy
1> 如果没有对block进行copy操作,block就存储与栈空间
2> 如果对block进行copy操作,block就存储与堆空间
3> 如果block存储于栈空间,不会对block内部所用到的对象产生强引用
4> 如果block存储与堆空间,就会对block内部所用到的对象产生强引用
对于block一般实用copy属性,但为了防止block的循环引用问题,需要创建完block以后,对其进行__weak操作弱化
循环引用其实就是相互调用,产生死循环,导致内存无法释放
解决循环引用:
非ARC(MRC)__block
ARC:__weak\__unsafe_unretained
eg:(ARC情况下)
JLPerson *p = [[JLPerson alloc] init];
__weak typeof(p) weakP = p;
p.testBlock = ^{
     [weakP run];
};
posted @ 2015-06-10 23:31  aprogrammer  阅读(440)  评论(0编辑  收藏  举报