iOS中循环引用的解除

摘要:
方法1:--断开引用链方法2:--使用__弱方法1:您可以在左控制器viewcontroller中执行一个动作来改变自身。将工具转换为NetworkTools*工具,使工具成为局部变量?????

一:为什么造成了循环引用??????????????????????????

iOS中循环引用的解除第1张

首先

对于网络工具类 finishedBlock里面 的一个属性是 copy的

那么 NetworkTools 会对网络工具 finishedBlock进行一个强引用

左边的控制器viewController里面

viewController 对 NetworkTools对象 tools进行强引用

在右边有一个 self.finishedBlock = finished 的赋值

在左边的self.view 然后呢 self.finishedBlock = finished 这个对self.view

进行一个强引用

造成了一个闭环 finishedBlock(引用)----self.view()--(self就是那个控制器器 对NetworkTools对象 tools强引用)----tools(引用了)finshedBlock

产生了一个闭环 造成了一个封闭的强引用

--------结果是谁释放不了

二:如何去打断循环引用?????????????????????????

方式1:--打断引用链条 方式2:--使用__weak

方式1: 可以在左边的控制器viewcontroller里面去做一个动作

把那个 self.tools改成一个

NetworkTools * tools 让tools成为一个局部的变量 懂?????

他自然在走出了作用域就会自动释放了 打破了上面的环节 没有了self.view

那个控制器的对他的强引用

这个就是破坏引用链条的原理

方式2: 在

iOS中循环引用的解除第2张

在左边添加了

// 方式2

__weak typeof(self) weakSelf = self;

[self.tools lodaData:^(NSString *html) {

NSLog(@"%@ %@",html,weakSelf.view);

}];

添加了这样的东西的话 我们就可以的接触循环引用的

这个引用链条也会被破坏掉 破坏是在那个 finishedBlock 对self.view的那个环节

总体思路的是:打破循环引用环节的任何一环就行

方法3: 使用__unsafe_unretained typeof(self) weakSelf = self;

//方法3

__unsafe_unretained typeof(self) weakSelf= self;

[self.tools lodaData:^(NSString *html) {

NSLog(@"%@ %@",html,weakSelf.view);

}];

三:对__unsafe_unretained和 __weak的深度挖掘??????????????

我们在网络工具类里面去的做一个耗时操作去模仿网络请求延时操作

__weak是iOS5.0的

iOS中循环引用的解除第3张

这个时候 weakSelf.view打印的是null

如果异步操作没有完成的话,他就会释放控制器 __weak本身是弱引用

当异步操作执行完毕了的话 ,此时进行回到的时候 self已经被释放了 无法再去访问属性 也无法调用方法 所以打印的是null

( 所以在点击返回的快慢不同 打印结果不同)

iOS中循环引用的解除第4张

用__unsafe_unretained的时候 __unsafe_unretained是iOS4.0推出的

iOS中循环引用的解除第5张

程序就崩溃了 这个MRC的错误 坏内存访问 野指针错误

__weak相当于 weak 不会做强引用 但是如果对象被释放,执行地址会指向nil

MRC下面属性的持有都是assign 不会做强引用 但是如果对象被释放

内存地址还不变 此时再去调用 就会出现野指针的访问

所以在开发中一般去推荐__weak __unsafe_unretained相对于不安全

还有一种流传出来的代码

(stringSelf强引用 对weakSelf进行强引用 本意 希望在执行完代码了后 继续执行回调)

iOS中循环引用的解除第6张

但是如果的话__unsafe_unretained 换成这个 他还是会崩溃的

总体的区别:

__weak 写法的话 self 已经被释放 只为nil

__unsafe_unretained的话 self已经被释放的话 就会出现野指针访问

内部可以使用 strongSelf 但是没有深恶么卵用

免责声明:文章转载自《iOS中循环引用的解除》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇iOS- 微信支付 (服务器调起支付 )以及回调不成功的原因 不看后悔Win7(64)+eclipse(64)+tomcat7(64)+jdk7(64)开发环境配置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

taro3.x: 回到顶部ScrollView实现方式

使用ScrollView,onScroll,scrollTop属性设置Math.random()(0-1)之间实现 import React, { useState } from 'react' import { View, Input, ScrollView, Text } from '@tarojs/components' import classn...

ZRender源码分析3:Painter(View层)-上

回顾 上一篇说到:ZRender源码分析2:Storage(Model层),这次咱看来看看Painter-View层 总体理解 Painter这个类主要负责MVC中的V(View)层,负责将Storage中的shape对象绘制到canvas中,包括了:更新、渲染、变化大小、导出、修改等操作。 Painter这个类还是很明显的构造函数,然后把方法赋值到Pai...

Cesium动态绘制实体(点、标注、面、线、圆、矩形)

  //自定义绘制图形,支持 点,线,面,矩形,圆,标识,可自定义绘制过程中的和绘制完的预览 this.drawGraphic = function(view,_mode,_callback,_GraphicProperty){ //清空所有可能的监听和画到一半的图形 if(handler){...

微信小程序 View:flex 布局

微信小程序 View 支持两种布局方式:Block 和 Flex 所有 View 默认都是 block 要使用 flex 布局的话需要显式的声明: display:flex; 下面就来介绍下微信小程序的 Flex 布局 先做一个简单的 demo <view class="main"><view class="item item1">...

代理和协议区别及应用

协议与代理 一、理解协议与代理协议:协议是一个方法签名的列表,在其中可以定义若干个方法。根据配置,遵守该协议的类会去实现这个协议中规定的若干个方法。代理:代理是一个概念,很难用一个名词去定义(如我们可以说协议其实就是一个方法列表)。它更像是一种关系,我要做某一个事情,但我自己不想去做这件事,我委托其他人帮我去做这件事。这个时候,这位其他人就是我的代理。二、...

七天开发进度(六)(微信小程序版(一))

1. 今天主要根据网上教程学习了微信小程序的代码结构,和代码编写-Tabbar配置, 学习了app.js的App和Page方法, 认识了view组件,button组件,input组件,但是还没怎么应用,还有如何进行首页的开发等等。 这是观看视频时这三种组件的演示 view演示  input演示 button演示 这是简单实现的一个页面,还不完善,明天...