block本身不是self的屬性或者變量時,在block內使用self不會造成循環(huán)引用,若是self本身的屬性或者變量時在block中使用self引用自身strong屬性將會造成retain cycle:
由于block被self持有,block又持有了self,兩者間強引用造成循環(huán)引用,無法釋放,此時可以通過 __weak typeof(self) weakSelf = self;的形式將self弱化,在block執(zhí)行完成之前weakself被釋放,self也被釋放,強引用循環(huán)被打破:
使用場景: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即可打破循環(huán)引用。