关于iOS中循环引用的场景:
1、代理 delegate
这个一般是不会出错的,ARC创建代理的时候我们用的是weak,MRC下我们用的assign。基本就避免了这个问题。
2、block
把block创建某个类的成员属性时,self会对block产生一个强引用,block创建用的是copy,是因为block会对block内部的变量的值进行copy。这时候block会对block中的变量产生一个强引用。 如果block中有 self.xxxx 或者有属于self的成员但是没有self. 这样的话 就造成了block的循环引用问题。
解决办法: 通过 __weak __block 去声明一个弱引用的self 。
_weak
typeof
(self) weakSelf = self;
self.blkA = ^{
__strong
typeof
(weakSelf) strongSelf = weakSelf;
//加一下强引用,避免weakSelf被释放掉
NSLog(
@"%@"
, strongSelf->_xxView);
//不会导致循环引用.
};
(代码为摘抄的)
3、NSTimer
同样是当NStimer作为某个类的成员属性是会发生循环引用。设置为成员属性是有一个self对timer的强引用, 在实例timer的时候一般指定的target为:self。这样就造成了循环引用,
解决办法:
//停止定时器
[self.myTimer invalidate];
//销毁timer
self.myTimer = nil;
注: NStimer停止后是不能再开启的,所以使用的时候 停止timer后设为nil。再在使用的地方创建一个nstimer就好。
鄙人愚见,如有不同的意见或者有问题的地方请评论,或者联系本人QQ:285160304