block本身不是self的属性或者变量时,在block内使用self不会造成循环引用,若是self本身的属性或者变量时在block中使用self引用自身strong属性将会造成retain cycle:
由于block被self持有,block又持有了self,两者间强引用造成循环引用,无法释放,此时可以通过 __weak typeof(self) weakSelf = self;的形式将self弱化,在block执行完成之前weakself被释放,self也被释放,强引用循环被打破:
使用场景:packetTunnelProvider中:
__weak typeof(self) weakSelf = self;
[self setTunnelNetworkSettings:networkSettings completionHandler:^(NSError * _Nullable error) {
if (error) {
completionHandler(error);
}else{
weakSelf.proxyServer = [Helper getHttpProxyServerWithPort:weakSelf.proxyPort];
NSError *error = nil;
[weakSelf.proxyServer startAndReturnError:&error];
}
}];
setTunnelNetworkSettings闭包为self所持有的闭包,.proxyServer等为当前类所持有的属性,通过weakself即可打破循环引用。