解释SDWebImage代码中__weak和__strong的使用原因

2023-11-21

我认为我很好地理解了强关键字和弱关键字,但我不明白它在下面的代码中是如何使用的。此代码来自 Olivier Poitrey 的 SDWebImage,可在 github 上找到。我了解强关键字和弱关键字,如下所述:iOS5中强存储和弱存储的解释

下面的代码以我好奇的方式使用 __weak 和 __strong 关键字。它不是子父关系或委托模式,因为我习惯于看到弱使用。但是,我确信这是一种经常使用的模式,正如我之前在其他代码中看到的那样。它在另一个线程上运行的块之前设置 __weak 引用。然后,在块内,它将弱引用设置为强引用。

我确信这段代码很好而且很优雅,所以我正在尝试理解它。如果“self”在块运行之前不再存在,则弱自引用将归零。当块运行时,强引用也将设置为零。因此,它会知道终止其余的操作,因为 self 不再存在。我做对了吗?

现在,如果我们不使用 __weak 和 __strong 关键字会发生什么?如果我们只是检查块内部是否 self == nil 会怎么样。既然块复制了整个树,“self”就永远不会为零吗?

有人可以帮助揭开这段精彩代码的神秘面纱吗?有人可以验证或否定我的假设吗?

- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletedBlock)completedBlock;
{
    [self cancelCurrentImageLoad];

    self.image = placeholder;

    if (url)
    {
        __weak UIImageView *wself = self;
        id<SDWebImageOperation> operation = [SDWebImageManager.sharedManager downloadWithURL:url options:options progress:progressBlock completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished)
        {
            __strong UIImageView *sself = wself;
            if (!sself) return;
            if (image)
            {
                sself.image = image;
                [sself setNeedsLayout];
            }
            if (completedBlock && finished)
            {
                completedBlock(image, error, cacheType);
            }
        }];
        objc_setAssociatedObject(self, &operationKey, operation, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
}

The downloadWithUrl:方法可能需要很长时间。那时,用户可能决定离开,从而不再需要SDWebImage目的。为了方便物体的早期清理,外部self参考性较弱。这边走,downloadWithUrl不会阻止SDWebImage免于被解除分配.

当然,如果你真的想和self,你需要一个强有力的参考。所以,完成时块downloadWithUrl抓住一个强有力的参考self。如果这个物体在这段时间内消失了,sselfnil。否则,它将是一个有效的强引用,表明SDWebImage对象还在附近,此时对象就完成了它的工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解释SDWebImage代码中__weak和__strong的使用原因 的相关文章

  • 使用 AVAssetExportSession 导出延时会导致黑色视频

    我需要能够合并使用 iOS 上的相机应用程序中的延时拍摄功能拍摄的视频并导出为单个视频 但是 即使我尝试将单个未更改的延时视频导出到照片库 它也会保存为全黑视频 具有正确的持续时间 以下是我编写的示例代码 用于导出单个未更改的视频 其中大部
  • 添加自定义参数 - Phonegap Build

    最近 Apple 强制要求在上传到 Itunesconnect 的每个版本中添加声明加密 密码学 但由于它不适用于我 因为我的应用程序不涉及苹果页面所说的任何功能 如果我错了 请纠正我 我想申请豁免 为此我必须添加
  • iPhone:什么是 Springboard?我需要关心吗?

    在模拟器中创建 iPhone 应用程序时 我有时会看到诸如 Springboard 无法启动应用程序 等消息 什么是跳板 作为开发人员我应该了解哪些事情 跳板 https stackoverflow com questions 300793
  • 有没有办法更改 UITabBar 或 UITabBarItem 中的文本位置?

    这是我打算放在屏幕上的自定义选项卡栏 然而 我的搭档希望文字稍微向上一些 我怎样才能这样做呢 为什么不为视图控制器设置一个空的标题属性 并将标题添加到选项卡的自定义图像中 UPDATE 为了回答的完整性 来自评论和ios标签栏在没有图像时将
  • 将 UIDatePicker 装入 UIActionSheet 中

    我正在尝试让带有 UIButton 的 UIDatePicker 显示在 UIActionSheet 中 不幸的是 它被剪掉了 整个日期选择器都不可见 我什至还没有尝试添加 UIButton 谁能建议让整个视图正确配合 我不确定如何添加正确
  • didChangeCameraPosition 获取可用坐标的边界框/矩形

    如何从 GMSCameraPosition 检索 GMSColinedBounds 我想知道每次用户移动相机时地图上的可见坐标 至少东北 西南点 如下所示 void mapView GMSMapView mapView didChangeC
  • 为什么 UIWebView 吃这么多内存?

    我正在使用 UIWebView 为我的 iPad 应用程序加载纯文本 HTML 页面 HTTP页面的大小只有40KB 但是当我使用仪器监控加载 UIWebView 的内存使用情况时 我发现它消耗了大约 20MB 内存 如果我滚动 Web 视
  • 如何更改故事板的初始视图控制器?

    我有2个视图控制器 我禁用了第一个视图控制器的初始视图控制器 并启用了第二个视图控制器 但是当启动项目时 初始视图控制器仍然是第一个视图控制器 我该怎么办 谢谢 点击第二个视图控制器 然后选择 Is initial View Control
  • UITouch移动速度检测

    我正在尝试检测触摸移动的速度 但并不总能得到我期望的结果 补充 速度峰值太多 任何人都可以发现我是否在做一些时髦的事情或建议更好的方法吗 void touchesBegan NSSet touches withEvent UIEvent e
  • 本地化 watchkit 配套应用程序的显示名称

    我在 Apple Watch 配套应用程序上本地化应用程序显示名称时遇到一些问题 按照指导方针 我将 CFBundleName 本地化如下 CFBundleDisplayName 我的应用程序 CFBundleName 我的应用程序 我为我
  • iPhone iOS 是否有用于类似代数计算器的应用程序的表达式解析器?

    我正在构建一个应用程序 可以通过加速度计和陀螺仪输出来分析手机的运动 我很可能会将这个动作捕获为一组变量 应用程序将在内部跟踪这些变量 我试图提供一种方法来绘制这些变量和涉及这些变量的方程 我想让用户能够通过输入 a b c d 等方程 其
  • 如何确定当前处于活动状态的视图控制器/显示视图的视图控制器?

    在我的应用程序中 我正在排队一些本地通知 当它们触发时我必须呈现模式视图 问题是我有许多视图控制器 其中任何一个当前都可能处于活动状态 因此需要呈现模式视图控制器 如何确定当前正在使用哪一个 我将导航控制器设置为 Windows 根视图控制
  • 如何在 VMware 中运行的 MAC 操作系统中安装 Xcode - 无法安装 Xcode,因为需要 OS X 版本 10.12 或更高版本

    我想开始进行 iOS 应用程序开发 但此时我买不起 MAC 计算机 因此我在 VMware 的虚拟机中安装了 MAC OS X Sierra 方法如下 下一步是获取 XCode 所以我打开App Store并搜索它 我发现一个错误 内容是M
  • cocos2d中获取CCSprite的绝对位置

    在我的游戏中 我有一个CCSprite绕另一个轨道运行CCSprite 很像电子绕原子核运行 我将电子作为原子核的子元素 以使动画更加简单 我所要做的就是旋转原子核 电子就会很好地跟随 然而 我的问题来自于想要让轨道动画看起来更时髦一点 通
  • UIView类中addSubview和insertSubview的区别

    有什么区别addSubview and insertSubView以编程方式添加视图时的方法 唯一的区别在于视图添加的位置 是否是最前面的视图 addSubview 或者在第 5 个子视图之前 insertSubview atIndex 或
  • 在哪里可以了解有关 WebCoreSharedBufferData 的更多信息?

    我有一个在 iOS 6 上完美运行的应用程序 但在 iOS 7 上 如果用户采取了非常具体的操作 太复杂而无法进入 但它使用UIWebView并且它是一致的 应用程序崩溃并出现错误 Terminating app due to uncaug
  • Cocoapods 框架不支持配置文件

    我是 iOS 开发领域的新手 我正在从事 iOS 应用程序开发工作 我正在使用 Cocoapods 集成 Alamofire 和 KeychainSwift 等第三方库 当我导出存档以从本地生成 ipa 文件时 它工作正常 但是当我尝试在
  • 将子视图控制器添加到当前视图控制器

    我正在尝试使用以下代码在代码中将子视图控制器添加到情节提要中的当前视图控制器 UIStoryboard storyboard UIStoryboard storyboardWithName Main bundle nil LogInTuto
  • 用于测试对象类型的通用 Swift 函数

    我正在尝试编写一个函数 该函数接受一个对象和一个类型作为参数 并返回一个布尔值 指示该对象是否属于给定类型 似乎没有 Type 类型 所以我不知道如何做到这一点 我能做的最好的就是 func objectIsType
  • 深入了解崩溃的根源

    我遇到了以下崩溃 我无法按需复制 但确实发生了足以引起用户注意的事件 该崩溃报告也已被符号化 怎么查原因啊 这似乎只发生在 4 1 上 Exception Type SIGSEGV Exception Codes SEGV ACCERR a

随机推荐

  • boost中path::string()和path::generic_string()有什么区别?

    有什么区别boost path string and boost path generic string 什么时候应该使用它们 这在文档 你只需要阅读文档获得知识和理解 请从现在开始养成这样做的习惯 升压 路径 字符串 返回一个std st
  • 如何使用 DAO 检测 Yii 中事务中的最后一个插入 ID?

    这就是源代码 我需要检测 ID 请参阅下面两个查询之间的标记位置 connection Yii app gt db transaction connection gt beginTransaction try q INSERT INTO s
  • 如何检查 UITextField 的文本是否是有效的电子邮件?

    我有一个带有 3 个 UITextFields 用户名 电子邮件和密码 的视图控制器 我需要一种方法 首先检查所有字段中是否都有文本 然后检查电子邮件的文本字段是否是有效的电子邮件 也许通过检查它是否有 登录它 有人能帮忙吗 以下代码用于使
  • OpenMP 令人尴尬的并行 for 循环,没有加速

    我有一个看起来非常简单的平行for循环 它只是将零写入整数数组 但事实证明 线程越多 循环就越慢 我认为这是由于一些缓存抖动造成的 所以我研究了时间表 块大小 restrict 将并行 for 嵌套在并行块内 然后刷新 然后我注意到读取数组
  • 如何访问命名空间“windows”

    include
  • 如何在 android studio 2.2 中添加预建的 *.so 库

    我尝试将库添加到项目中 但 android studio 忽略了我的库 我的 CmakeLists txtadd library mylib SHARED IMPORTED set target properties ffmpeg PROP
  • GitHub 页面生成器删除

    Context 我通常会建立快速的 GitHub 页面来记录我所做的一些开发 它们通常是非常简单的页面 是我使用页面生成器从存储库设置生成的 我想继续使用这种方法 因为对于如此简单的事情来说 使用 jekyll 转移到正确的 gh page
  • 将图像从剪贴板粘贴到网站

    我需要想出一个解决方案 让用户能够将图像粘贴到网站上 然后将该图像上传到网络服务器 我不确定正确的解决方案是什么 我很确定 javascript 是不可能的 因为我不认为它可以处理二进制剪贴板数据 或任何剪贴板数据 所以 我不确定该走哪条路
  • 如何在开发机器上测试从asp.net发送电子邮件?

    我该如何实现这个目标 SMTP 类在开发计算机上抛出有关找不到 SMTP 服务器的错误 有没有办法在开发机器上测试发送电子邮件 Shawn 直接来自我的 web config
  • R闪亮:如何构建动态UI(文本输入)

    我正在尝试使用 R闪亮构建动态textInput 用户应该在文本字段中写入 然后按添加按钮来填充另一个字段 但是 每次我按下按钮时 所有字段都会变空 就像我必须提前定义我想要多少个字段一样 任何帮助将不胜感激 谢谢 这是我的代码 libra
  • Ant——仅从树上的一个子目录复制文件和子目录

    我想使用 Ant 从单个子目录复制文件和子目录 而不复制其余的目录结构和内容 例如 我想复制 dir 3 其文件 file 1 到 file n 和子目录 dir 4 和 dir 5 但不复制 dir 1 或 dir 2 我可以使用一种模式
  • 使用 NSRegularExpression 命名捕获组

    Does NSRegularExpression支持命名捕获组吗 看起来不像是从文档 但我想在探索替代解决方案之前进行检查 iOS 中不支持命名分组 据我所知 您所能做的就是利用Enum Enum typedef enum kDayGrou
  • SQL Server:使用 FOR XML PATH 嵌套元素

    我想嵌套每个 XML 元素 举个例子 DECLARE TempTable TABLE Column1 char 10 Column2 char 10 INSERT INTO TempTable Column1 Column2 VALUES
  • 如何内爆数组索引?

    是否有可能破坏数组的索引 一个函数返回给我一个数组 我需要的是该数组的索引 所以我只想在数据库工作中使用逗号或任何其他字符来内爆 inexes 你的意思是这样的 implode array keys some arr 正确的 这是文档 fo
  • 修改 Django UserCreationForm

    我想向标准 Django UserCreationForm 添加更多字段 因此我继续将其子类化到我的应用程序的 forms py 文件中 最终得到以下结果 class CustomUserCreationForm UserCreationF
  • RabbitMQ C# 验证消息已发送

    我是 RabbitMQ 的新手 尝试写入队列并验证消息是否已发送 如果失败了 我需要知道它 我做了一个假队列来观察它失败 但无论我看到什么 都没有任何异常 当我寻找一个确认时 我总是得到一个 我从未见过 BasicNack 我什至不确定我是
  • emacs:类和结构的不同缩进

    我试图在 emacs 中实现以下缩进 class A I ALWAYS use access labels in classes public access label int member inclass struct B I NEVER
  • AspectJ JoinPoint 问题

    我目前正在使用 JoinPoint 捕获运行时传递给服务方法的参数 虽然 JoinPoint 帮助我检索参数值 但我发现它没有提供任何好的 API 来检索参数名称 参数类型 当传递的参数是数组等时的单个参数值 这是一个例子 public v
  • Rails 3.1 - CSRF 被忽略?

    这是我的问题 我有一个 Rails 3 1 应用程序 我正在尝试发出 ajax 请求 但收到警告消息 警告 无法验证 CSRF 令牌的真实性 在我的布局中 我有辅助方法 csrf method tag 我添加了以下javascript代码
  • 解释SDWebImage代码中__weak和__strong的使用原因

    我认为我很好地理解了强关键字和弱关键字 但我不明白它在下面的代码中是如何使用的 此代码来自 Olivier Poitrey 的 SDWebImage 可在 github 上找到 我了解强关键字和弱关键字 如下所述 iOS5中强存储和弱存储的