一、block引发的循环引用
1、在block中使用对自身对象的弱引用来替换self
__weak typeof(self) weakSelf = self;
[objectB setCallbackBlock:^{
[weakSelf excuBlock];
}];
2、如果在block使用了成员变量,也要使用其弱引用,以 _dataSource为例:
__weak typeof(_dataSource) weakDataSource = _dataSource;
二、强引用的delegate引发的循环引用
对代理使用弱引用
@property (nonatomic, weak) id<WZDelegate> delegate;
三、使用了NSTimer没有销毁
当我们使用NSTimer的方法
self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerAction) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop]addTimer:self.timer forMode:NSRunLoopCommonModes];
时,定时器对象会对它的target(即self:当前控制器)持有强引用,如果定时器不销毁,则控制器无法释放。
解决方法:
在- (void)viewWillDisappear:(BOOL)animated
或者- (void)viewDidDisappear:(BOOL)animated
或者其他确定离开当前控制器的方法中销毁定时器。
- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
if (self.timer != nil) {
[self.timer invalidate];
self.timer = nil;
}
}