File tree Expand file tree Collapse file tree
2023/10/21/iOS/揭开 iOS 中 weak 指针的神秘面纱:从原理到实践 Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1818</ head > < body > < canvas class ="fireworks "> </ canvas > < i class ="fa fa-arrow-right " id ="toggle-sidebar " aria-hidden ="true "> </ i > < div id ="sidebar " data-display ="true "> < div class ="toggle-sidebar-info text-center "> < span data-toggle ="切换文章详情 "> 切换站点概览</ span > < hr > </ div > < div class ="sidebar-toc "> < div class ="sidebar-toc__title "> 目录</ div > < div class ="sidebar-toc__progress "> < span class ="progress-notice "> 你已经读了</ span > < span class ="progress-num "> 0</ span > < span class ="progress-percentage "> %</ span > < div class ="sidebar-toc__progress-bar "> </ div > </ div > < div class ="sidebar-toc__content "> < ol class ="toc "> < li class ="toc-item toc-level-2 "> < a class ="toc-link " href ="#%E5%89%8D%E8%A8%80 "> < span class ="toc-number "> 1.</ span > < span class ="toc-text "> 前言</ span > </ a > </ li > < li class ="toc-item toc-level-2 "> < a class ="toc-link " href ="#weak-%E6%8C%87%E9%92%88%E4%B9%8B%E7%BC%96%E8%AF%91%E6%9C%9F%E5%AE%9E%E7%8E%B0 "> < span class ="toc-number "> 2.</ span > < span class ="toc-text "> weak 指针之编译期实现</ span > </ a > </ li > < li class ="toc-item toc-level-2 "> < a class ="toc-link " href ="#weak-%E6%8C%87%E9%92%88%E4%B9%8B%E8%BF%90%E8%A1%8C%E6%97%B6%E5%AE%9E%E7%8E%B0 "> < span class ="toc-number "> 3.</ span > < span class ="toc-text "> weak 指针之运行时实现</ span > </ a > < ol class ="toc-child "> < li class ="toc-item toc-level-3 "> < a class ="toc-link " href ="#weak-%E6%8C%87%E9%92%88%E7%9A%84%E5%88%9D%E5%A7%8B%E5%8C%96%E7%BB%86%E8%8A%82%EF%BC%9AstoreWeak "> < span class ="toc-number "> 3.1.</ span > < span class ="toc-text "> weak 指针的初始化细节:storeWeak</ span > </ a > </ li > < li class ="toc-item toc-level-3 "> < a class ="toc-link " href ="#weak-%E6%8C%87%E9%92%88%E5%BB%BA%E7%AB%8B%E5%85%B3%E8%81%94%E7%9A%84%E7%BB%86%E8%8A%82%EF%BC%9Aweak-register-no-lock "> < span class ="toc-number "> 3.2.</ span > < span class ="toc-text "> weak 指针建立关联的细节:weak_register_no_lock</ span > </ a > </ li > </ ol > </ li > < li class ="toc-item toc-level-2 "> < a class ="toc-link " href ="#%E6%B7%B1%E5%85%A5%E5%89%96%E6%9E%90-SideTable-%E7%B1%BB%E5%9E%8B "> < span class ="toc-number "> 4.</ span > < span class ="toc-text "> 深入剖析 SideTable 类型</ span > </ a > </ li > < li class ="toc-item toc-level-2 "> < a class ="toc-link " href ="#weak-%E6%8C%87%E9%92%88%E8%87%AA%E5%8A%A8%E8%B5%8B%E5%80%BC-nil-%E7%9A%84%E5%AE%9E%E7%8E%B0%E7%BB%86%E8%8A%82%EF%BC%9Aweak-clear-no-lock "> < span class ="toc-number "> 5.</ span > < span class ="toc-text "> weak 指针自动赋值 nil 的实现细节:weak_clear_no_lock</ span > </ a > </ li > < li class ="toc-item toc-level-2 "> < a class ="toc-link " href ="#%E6%80%BB%E7%BB%93 "> < span class ="toc-number "> 6.</ span > < span class ="toc-text "> 总结</ span > </ a > </ li > < li class ="toc-item toc-level-2 "> < a class ="toc-link " href ="#%E5%85%B3%E4%BA%8E-weak-%E6%8C%87%E9%92%88%E7%9A%84%E4%B8%80%E4%BA%9B%E7%96%91%E9%97%AE%E4%B8%8E%E8%A7%A3%E7%AD%94 "> < span class ="toc-number "> 7.</ span > < span class ="toc-text "> 关于 weak 指针的一些疑问与解答</ span > </ a > < ol class ="toc-child "> < li class ="toc-item toc-level-3 "> < a class ="toc-link " href ="#%E4%B8%BA%E4%BB%80%E4%B9%88%E4%B8%8D%E8%83%BD%E7%BB%99-Category-%E6%B7%BB%E5%8A%A0-weak-%E5%B1%9E%E6%80%A7%EF%BC%9F "> < span class ="toc-number "> 7.1.</ span > < span class ="toc-text "> 为什么不能给 Category 添加 weak 属性?</ span > </ a > </ li > < li class ="toc-item toc-level-3 "> < a class ="toc-link " href ="#%E4%B8%BA%E4%BB%80%E4%B9%88%E5%9C%A8-block-%E4%B8%AD%E4%B8%8D%E8%83%BD%E4%BD%BF%E7%94%A8-weak-%E6%8C%87%E9%92%88%E8%AE%BF%E9%97%AE%E5%85%B6%E6%88%90%E5%91%98%E5%8F%98%E9%87%8F%E3%80%82 "> < span class ="toc-number "> 7.2.</ span > < span class ="toc-text "> 为什么在 block 中不能使用 weak 指针访问其成员变量。</ span > </ a > </ li > < li class ="toc-item toc-level-3 "> < a class ="toc-link " href ="#%E4%B8%BA%E4%BB%80%E4%B9%88%E5%9C%A8%E5%AF%B9%E8%B1%A1%E6%B2%A1%E6%9C%89%E5%BC%B1%E5%BC%95%E7%94%A8%E6%97%B6%E4%B9%9F%E4%BC%9A%E6%89%A7%E8%A1%8C-weak-clear-no-lock "> < span class ="toc-number "> 7.3.</ span > < span class ="toc-text "> 为什么在对象没有弱引用时也会执行 weak_clear_no_lock</ span > </ a > </ li > </ ol > </ li > </ ol > </ div > </ div > < div class ="author-info hide "> < div class ="author-info__avatar text-center "> < img src ="https://github.com/internetWei/internetwei.github.io/blob/master/images/avatar.jpg?raw=true "> </ div > < div class ="author-info__name text-center "> 布多</ div > < div class ="author-info__description text-center "> 前进!前进!!不择手段地前进!!!</ div > < div class ="follow-button "> < a target ="_blank " rel ="noopener " href ="https://github.com/internetwei "> Follow Me</ a > </ div > < hr > < div class ="author-info-articles "> < a class ="author-info-articles__archives article-meta " href ="/archives "> < span class ="pull-left "> 文章</ span > < span class ="pull-right "> 9</ span > </ a > < a class ="author-info-articles__tags article-meta " href ="/tags "> < span class ="pull-left "> 标签</ span > < span class ="pull-right "> 8</ span > </ a > < a class ="author-info-articles__categories article-meta " href ="/categories "> < span class ="pull-left "> 分类</ span > < span class ="pull-right "> 4</ span > </ a > </ div > < hr > < div class ="author-info-links "> < div class ="author-info-links__title text-center "> 友链</ div > < a class ="author-info-links__name text-center " target ="_blank " rel ="noopener " href ="https://www.coderqi.com/ "> 齐小胖之家</ a > </ div > </ div > </ div > < div id ="content-outer "> < div id ="top-container " style ="background-image: url(/images/backgroundImage.jpg) "> < div id ="page-header "> < span class ="pull-left "> < a id ="site-name " href ="/ "> 布多的博客</ a > </ span > < i class ="fa fa-bars toggle-menu pull-right " aria-hidden ="true "> </ i > < span class ="pull-right menus "> < a class ="site-page " href ="/ "> 首页</ a > < a class ="site-page " href ="/tags "> 标签</ a > < a class ="site-page " href ="/categories "> 分类</ a > < a class ="site-page " href ="/archives "> 归档</ a > < a class ="site-page " href ="/about "> 关于</ a > </ span > < span class ="pull-right "> < a class ="site-page social-icon search "> < i class ="fa fa-search "> </ i > < span > 搜索</ span > </ a > </ span > </ div > < div id ="post-info "> < div id ="post-title "> 揭开 iOS 中 weak 指针的神秘面纱:从原理到实践</ div > < div id ="post-meta "> < time class ="post-meta__date "> < i class ="fa fa-calendar " aria-hidden ="true "> </ i > 2023-10-21</ time > < span class ="post-meta__separator "> |</ span > < i class ="fa fa-inbox post-meta__icon " aria-hidden ="true "> </ i > < a class ="post-meta__categories " href ="/categories/iOS/ "> iOS</ a > < div class ="post-meta-wordcount "> < span > 字数总计: </ span > < span class ="word-count "> 5.2k</ span > < span class ="post-meta__separator "> |</ span > < span > 阅读时长: 19 分钟</ span > </ div > </ div > </ div > </ div > < div class ="layout " id ="content-inner "> < article id ="post "> < div class ="article-container " id ="post-content "> < blockquote >
1919< p > 由 布多(budo) 发布于 2023-10-21 • 最后更新于 2025-02-10</ p >
2020</ blockquote >
21- < h2 id ="前言 "> < a href ="#前言 " class ="headerlink " title ="前言 "> </ a > 前言</ h2 > < p > < img src ="/%E6%8F%AD%E5%BC%80%20iOS%20%E4%B8%AD%20weak%20%E6%8C%87%E9%92%88%E7%9A%84%E7%A5%9E%E7%A7%98%E9%9D%A2%E7%BA%B1%EF%BC%9A%E4%BB%8E%E5%8E%9F%E7%90%86%E5%88%B0%E5%AE%9E%E8%B7%B5/entrance2.png "> </ p >
21+ < h2 id ="前言 "> < a href ="#前言 " class ="headerlink " title ="前言 "> </ a > 前言</ h2 > < p > < img src ="/2023/10/21/iOS/ %E6%8F%AD%E5%BC%80%20iOS%20%E4%B8%AD%20weak%20%E6%8C%87%E9%92%88%E7%9A%84%E7%A5%9E%E7%A7%98%E9%9D%A2%E7%BA%B1%EF%BC%9A%E4%BB%8E%E5%8E%9F%E7%90%86%E5%88%B0%E5%AE%9E%E8%B7%B5/entrance2.png "> </ p >
2222< p > weak 指针是 iOS 开发中一个非常基础的概念,在开发过程中我们经常使用它,它到底是怎么实现的?这篇文章将从 Runtime 源码入手,为你介绍 weak 指针的实现原理;让你知其然,更知其所以然。</ p >
2323< h2 id ="weak-指针之编译期实现 "> < a href ="#weak-指针之编译期实现 " class ="headerlink " title ="weak 指针之编译期实现 "> </ a > weak 指针之编译期实现</ h2 > < p > 当我们初始化一个 weak 指针时: < code > __weak typeof(obj) weakObj = obj;</ code > ,编译器其实会把它们转换成类似这样的代码:< code > objc_initWeak((void *)&weakObj, obj);</ code > </ p >
2424< p > < img src ="https://github.com/internetWei/internetwei.github.io/blob/master/images/%E6%8F%AD%E5%BC%80%20iOS%20%E4%B8%AD%20weak%20%E6%8C%87%E9%92%88%E7%9A%84%E7%A5%9E%E7%A7%98%E9%9D%A2%E7%BA%B1%EF%BC%9A%E4%BB%8E%E5%8E%9F%E7%90%86%E5%88%B0%E5%AE%9E%E8%B7%B5/entrance.png?raw=true " alt ="weak 指针的初始化入口 "> </ p >
Original file line number Diff line number Diff line change @@ -29,7 +29,7 @@ <h2 id="我是谁"><a href="#我是谁" class="headerlink" title="我是谁"></a
2929< p > 我很少玩游戏和刷短视频。我曾经也很喜欢诸如穿越火线、英雄联盟等游戏,也喜欢刷头条;现在已经戒了,因为我发现它们实在太容易让人上瘾了。</ p >
3030< p > 我以前有很强的完美主义者倾向,曾经花了1天时间就为了寻找一个合适的方法名称;后来经过时间的磨练,现在已经能很好的平衡这种完美和效率了😂。过于追求完美的开端会让你永远无法开始,过于追求细节会让你永远无法结束。</ p >
3131< p > 博客的内容包含iOS领域、IT领域,有时候也会有一些个人感想等等,类型不限。</ p >
32- < h2 id ="联系方式 "> < a href ="#联系方式 " class ="headerlink " title ="联系方式 "> </ a > 联系方式</ h2 > < p > 邮箱:< a href ="mailto:i ;n ;t ;ern ;e ;twe ;i ;@f ;o ;xm ;ai ;l.c ;o ;m ; "> i ;n ;t ;ern ;e ;twe ;i ;@f ;o ;xm ;ai ;l.c ;o ;m ;</ a > </ p >
32+ < h2 id ="联系方式 "> < a href ="#联系方式 " class ="headerlink " title ="联系方式 "> </ a > 联系方式</ h2 > < p > 邮箱:< a href ="mailto:i ;n ;t ;ern ;e ;twe ;i ;@f ;o ;xm ;ai ;l.c ;o ;m ; "> i ;n ;t ;ern ;e ;twe ;i ;@f ;o ;xm ;ai ;l.c ;o ;m ;</ a > </ p >
3333< h2 id ="结尾 "> < a href ="#结尾 " class ="headerlink " title ="结尾 "> </ a > 结尾</ h2 > < p > 如果你看到了这里,并且你觉得你也是这样的人,想改变世界的人,不要犹豫,马上联系我:< u > < a href ="mailto:internetwei@foxmail.com "> internetwei@foxmail.com</ a > </ u > ,我很期待和您成为挚友。</ p >
3434</ div > </ article > < nav id ="pagination "> < div class ="pagination "> </ div > </ nav > < div id ="lv-container " data-id ="city " data-uid ="MTAyMC81MzU5Ny8zMDA3MA== "> < script > ( function ( d , s ) {
3535 var j , e = d . getElementsByTagName ( s ) [ 0 ] ;
Load Diff Large diffs are not rendered by default.
Load Diff Large diffs are not rendered by default.
You can’t perform that action at this time.
0 commit comments