1 weak 自动置为nil的实现

runtime 维护了一个Weak表,weak_table_t

用于存储指向某一个对象的所有Weak指针。Weak表其实是一个哈希表,

key是所指对象的地址,value是weak指针的地址的数组。

在对象回收的时候,就会在weak表中进行搜索,找到所有以这个对象地址为键值的weak对象,从而置位nil。

2 weak实现的原理

2.1 初始化步骤

runtime 会调用objc_initWeak,初始化一个新的weak指针指向对象的地址。

2.2 添加引用的步骤

objc_initWeak 函数会调用 objc_storeWeak 函数,这个函数的作用是更新指针指向,创建对应的弱引用表

2.3 释放的时候

最后一步是触发调用arr_clear_deallocating 函数 ,根据对象的地址将所有weak指针地址的数组,遍历数组把其中的数据置为nil。

iOS weak 自动置为nil的实现相关推荐

  1. iOS经典面试题之“runtime是如何实现weak变量的自动置nil”

    一.weak 属性特点 weak 表明该属性定义了一种"非拥有关系" (nonowning relationship): 为 weak 属性设置新值时,设置方法既不保留新值,也不释 ...

  2. weak 如何将对象置为nil

    我们都知道Weak指针不会增加所引用对象的计数,并在引用对象被回收的时候自动被置为nil.通常用于解决循环引用问题.那么,自动被置为nil内部是如何实现的呢? 内部实现 -- Weak表 Runtim ...

  3. weak 属性需要在dealloc中置为nil吗

    不需要,在 ARC 环境下,无论是强指针还是弱指针都不需要在 dealloc 中置为 nil ,ARC 会自动处理的.

  4. iOS应用内置付费详尽攻略

    我最近正在制作的一个程序里面,我就决定先把程序免费(其中只包含一个故事),然后把更多的故事放在in-app purchase里面.在这篇教程里面,你将会学到如何使用程序内置付费来解琐本地程序里面的内容 ...

  5. iOS weak的使用

    iOS开发中,我们经常会听到weak这个词,它是Objective-C语言中的一个特性,用于解决循环引用的问题.在本文中,我们将深入探讨iOS weak的使用,包括它的定义.原理.优缺点以及使用场景等 ...

  6. ios weak和unown_Unowned 还是 Weak?生命周期和性能对比

    作者:Umberto Raimondi, 原文链接 ,原文日期:2016-10-27 每当处理循环引用(retain cycles)时,需要考量对象生命周期来选择 unowned 或者 weak 标识 ...

  7. IOS之自动创建项目各个文件夹

    IOS之自动创建项目各个文件夹 // // main.m // AutoCreateGroup // // Created by lujun on 2021/10/29. //#import < ...

  8. iOS 用内置浏览器Safari 打开网页

    iOS 开发的时候,我们需要打开某个网页,可以写一个web页面,也可直接使用浏览器打开网址 那么我们怎么样使用iOS 内置的浏览器打开网址呢? 如下: ios 10 之前使用 [[UIApplicat ...

  9. iOS 用内置浏览器Safari 打开网页

    iOS 开发的时候,我们需要打开某个网页,可以写一个web页面,也可直接使用浏览器打开网址 那么我们怎么样使用iOS 内置的浏览器打开网址呢? 如下: ios 10 之前使用 [[UIApplicat ...

最新文章

  1. mysql主从复制 跳过表_mysql主从复制-从库跳过异常日志点
  2. 菜鸟之webservice(一) 服务端搭建
  3. SQL Server 2005数据库日志文件损坏的情况下如何恢复数据库
  4. 机器学习资源-Harvard Ph.D Sam维护
  5. qt能使用logback_SpringBoot 中使用 LogBack 配置
  6. Axiso解决跨域访问 !!!!
  7. 前端经典面试题之CSS实现三栏布局,左右宽度固定,中间宽度自适应
  8. 两条信号之间加电容_上海贴片电阻电容厂家地址-华腾电子
  9. c语言获取按键,c语言获得键盘的按键
  10. recyclerview不显示_Android studio中导入v7包,使用recyclerview前的操作
  11. 汇编的接触——基础知识
  12. 在苹果mac中使用excel时,如何快速求和多行数值?
  13. Eureka Server 开启身份验证与客户端注册
  14. oracle 安装raid卡驱动,centos安装raid卡驱动总结
  15. python文本处理的几个库_6个高效的语言处理Python库,你用过几个?
  16. 4874: 筐子放球
  17. 快速原型VS敏捷、迭代
  18. 大数据到底应该如何学?
  19. webpy —— 简单直接的 python web 框架
  20. 从荣耀V20看技术人怎么销售自己

热门文章

  1. 20162325 金立清 S2 W8 C17
  2. EF-Linq将查询结果转换为Liststring
  3. Redhat、centos安装配置postgresql
  4. 引擎设计跟踪(九.14.2i) Android GLES 3.0 完善
  5. 【CSON原创】HTML5游戏框架cnGameJS开发实录(外部输入模块篇)
  6. spl_autoload_register与autoload区别
  7. 按下回车表示确定提交
  8. DllMain中不当操作导致死锁问题的分析--加载卸载DLL与DllMain死锁的关系
  9. C++中static_cast/const_cast/dynamic_cast/reinterpret_cast的区别和使用
  10. Ubuntu 32下Android NDK+NEON的配置过程及简单使用举例