块递归和破坏保留周期

2024-02-01

为了更好地说明问题,请考虑以下块递归的简化形式:

__block void (^next)(int) = ^(int index) {
    if (index == 3) {
        return;
    }
    int i = index;
    next(++i);
};
next(0);

XCode(启用 ARC)警告“在此块中强烈捕获“下一个”可能会导致保留周期".

Agreed.

问题1:通过将块本身设置为来成功打破保留周期吗?nil,以这种方式:

__block void (^next)(int) = ^(int index) {
    if (index == 3) {
        next = nil; // break the retain cycle
        return;
    }
    int i = index;
    next(++i);
};
next(0);

(注意:您仍然会收到相同的警告,但也许这是没有根据的)

问题2:更好的块递归实现是什么?

Thanks.


要完成无保留周期递归块执行,您需要使用两个块引用 - 一个弱引用,一个强引用。因此,对于您的情况,代码可能如下所示:

__block __weak void (^weak_next)(int);
void (^next)(int);
weak_next = next = ^(int index) {
  if (index == 3) {
    return;
  }
  int i = index;
  weak_next(++i);
};
next(0);

请注意,该块捕获弱块引用(weak_next),外部上下文捕获强引用(next)以保留该块。两个引用都指向同一个块。

See https://stackoverflow.com/a/19905407/1956124 https://stackoverflow.com/a/19905407/1956124此模式的另一个示例,它也使用块递归。此外,以下文章评论部分的讨论也与此相关:http://ddeville.me/2011/10/recursive-blocks-objc/ http://ddeville.me/2011/10/recursive-blocks-objc/

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

块递归和破坏保留周期 的相关文章

  • PFQueryTableViewController 错误

    我正在遵循在线教程 使用 Parse 作为后端创建照片共享应用程序 我已经运行了两次教程 两次都从头开始创建应用程序 但在同一位置仍然出现相同的错误 我到处寻找解决方案 但仍然没有运气 我正在使用 PFQueryTableViewContr
  • Swift 中的 import 语句是否有相关成本?

    阅读字符串宣言 我看到一个段落 https github com apple swift blob master docs StringManifesto md batteries included关于避免Foundation不需要的时候导
  • 如何检测用户是否第一次打开应用程序[重复]

    这个问题在这里已经有答案了 是否可以检测用户是否是第一次打开iOS应用程序 使用Objective C 我想在用户第一次打开应用程序时显示欢迎消息 但之后不再向他们显示 我正在寻找类似的东西 BOOL firstTime AppDelega
  • 无法在 ios 应用程序中通过 googlecast 正确投射视频

    我正在开发一个基于 AVPlayer 的自定义视频播放器项目 尝试整合谷歌演员 我已经根据谷歌图进行了集成 https codelabs developers google com codelabs cast videos ios http
  • 错误消息:您输入的捆绑包 ID 已被使用

    我正在尝试发布一个 iPhone 应用程序 这不是第一个 我过去已经发表过其他的 因此 我在第一个和第二个表单中输入了所需的信息 然后填写了第三个大表单 您还可以在其中上传图标和屏幕截图 好吧 我在上传屏幕截图之前按下了 保存 按钮 因为我
  • 如何为 iPhone 6+、6 和 5 指定不同尺寸?

    我想让 iPhone 6 6 和 5 上的视图看起来几乎相同 在附图中 我的意思是 例如 取消 按钮在 iPhone 5 中距离屏幕左边缘应为 30 像素 在 6 中为 35 像素 在 6 中为 45 像素 其他元素也类似 如何为每种类型设
  • 有没有办法在 Firebase 中等待查询完成?

    我正在使用 TableView 在 Viewcontroller 中的 iOS 应用程序中进行查询 我想确保在继续加载 TableView 之前我的查询已经返回 有没有办法保证查询已经完成 None
  • 如何在 iOS 13 中将 UISegmentedControl 的背景颜色设置为白色

    iOS 13 对 UISegmentedControl 进行了一些更改 包括切换所选片段时的非常漂亮的动画 但是我注意到它没有显示backgroundColor属性正确 它似乎总是有一点色彩 我见过回答如何设置的问题selectedSegm
  • Objective-C 中是否有相当于 C++ 动态转换的功能?

    如果我有两个类 子类和超类 SuperClass super new SuperClass SubClass sub new SubClass SubClass sub pointer The nice one line cast belo
  • 使用数组中的字符串淡入/淡出标签

    func setOverlayTitle self overlayLogo text Welcome var hello String Bon Jour GUTEN nMORGEN BONJOUR HOLA BUENOS D AS BUON
  • 在 WKWebView 中禁用缩放?

    有谁知道在 WKWebView 中禁用双击和捏缩放的简单方法 我尝试过的任何方法都不起作用 Webview scrollView allowsMagnification false Error value of type WKWebView
  • AVAudioPlayer 无法从网站播放 m4a 或 mp3 文件类型

    我试图在我的应用程序中找到一个仅纯 m4a 声音的 URL 我有音频的 URL 理论上可以下载它 然后 使用下载的文件URL到声音 我尝试使用AVAudioPlayer播放它 但它不播放任何声音 这是我的代码 在 URL 检索函数中 我调用
  • 在 iOS 上使用 RNCryptor 异步解密大文件

    我需要在 iOS 上使用 RNCryptor 异步解密一个大文件 以便显示进度条 我在任何地方都找不到示例 因此尝试了我猜对的方法 但是 我想出的方法不起作用 解密器的处理程序从未被调用 并且线程在发送所有数据后因 EXC BAD ADDR
  • 根据内容自动更改单元格高度 - Swift

    在 Swift 中使用 UITableView 有人可以帮我根据标签 图片和描述自动更改单元格的高度吗 所有信息都正确传递 我只需要帮助格式化它 我尝试使用调整它cell frame size height 但这没有效果 我可以更改故事板中
  • 防止 iOS 键盘在 cordova 3.5 中滚动页面

    我正在使用 Cordova 3 5 和 jQuery mobile 构建 iOS 应用程序 我在大部分应用程序中禁用了滚动功能 但是 当我选择输入字段时 iOS 键盘会打开并向上滚动页面 我不想要这个功能 由于输入足够高 键盘不会覆盖它 我
  • UICollectionView setLayout:animated: 不保留 zIndex

    我注意到打电话时setLayout animated in a UICollectionView要在两个布局之间切换 当前可见的单元格不遵循zIndex它的布局属性已设置在layoutAttributesForItemAtIndexPath
  • UITabBarController 为 TabBar 的每个 ViewController 提供不同的 Storyboard 文件

    我的团队正在开发一个具有 UITabBarController 的应用程序 我们正在使用 Storyboard 来开发界面和流程 由于我们是一个团队 所以我们不能将所有流程放在一个故事板中 因为这会导致与 SVN 同步出现问题 所以 解决方
  • 诊断和仪器均缺少“僵尸”选项

    运行 Xcode 4 0 2 Zombie 选项丢失 其他 SO 帖子建议找到它的两个地方 Product gt Run looks like this Product gt Profile looks like this 奇怪的是 我之前
  • ios8 键盘高度有所不同

    我使用下面的代码来获取键盘高度 该高度在带有 ios8 的 iPhone 5s 设备中与带有 ios7 的 IPhone4s 设备中有所不同 因此 当我在带有 ios8 的 iPhone5s 中点击它时 我的文本字段移动得非常高 而相同的代
  • 如何在 UITableView 的 switch 语句中创建变量?

    我正在构建一个包含三个部分的 tableView 我已经完成了前两个工作 但最后一个有点阻力 我的问题似乎涉及尝试在 switch 语句中声明变量 实际上是嵌套的 switch 语句 据我所知 这不是一个好主意 但在这种情况下 这似乎是唯一

随机推荐

  • 在android热敏打印机中打印阿拉伯字符

    打印机为GoojPRT便携式打印机PT 210 热敏打印机 相同的代码在另一台热敏打印机 POS 上有效 但在这台打印机上不适用于阿拉伯字符 英文字符很好 但阿拉伯字符显示为中文字符 尝试添加编码为字符集 UTF 8 并且不适用于阿拉伯字符
  • 如何使用 C++ 中的构造函数初始化 2d 向量?

    我知道如何像这样初始化一维向量 int myints 16 2 77 29 std vector
  • Mysql,SUM 列和 GROUP BY HOUR

    情况 简化 tableA id date val 0 2018 02 19 00 01 00 10 1 2018 02 19 00 02 00 10 2 2018 02 19 00 03 00 10 2018 02 19 23 59 00
  • 如何使用 Cef4Delphi 从 JavaScript 调用 Delphi 函数

    我是德尔福的初学者 目前使用Delphi Berlin 版本 我正在尝试从 JavaScript 调用 Delphi 函数 方法 例如 我想在单击带有附加数据属性的 html 按钮时打开一个新的 Delphi 表单 HTML代码
  • 如何禁用选项卡栏中的特定选项卡才能单击?

    有没有办法禁用选项卡栏中的特定选项卡 这样除非再次启用 否则无法单击它 感谢任何帮助 谢谢 编辑 吸收 忽略指针的代码不起作用 class MyTabbedPage extends StatefulWidget const MyTabbed
  • 如何将具有像 ResNet 这样的非序列架构的 Keras 模型拆分为子模型?

    我的模型是 resnet 152 我想将其切成两个子模型 问题是第二个子模型 我不知道如何构建从中间层到输出的模型 我尝试了这段代码这个回应 https stackoverflow com questions 52800025 keras
  • 元组列表的列表,按第一个元素分组并添加第二个元素

    假设我有以下元组列表 tuples 2017 04 11 2000000 00 2017 04 12 1000000 00 2017 04 13 3000000 00 2017 04 12 472943 00 2017 04 13 1000
  • JavaScript 浮点好奇心

    我尝试进行一些浮点比较 这是我发现的 130 130 000000000000014210854715 true 130 130 000000000000014210854716 false 9 9 00000000000000088817
  • 我可以在猫鼬聚合之前使用填充吗?

    我有两种模型 一种是用户 userSchema new Schema userID String age Number 另一个是所有用户每天多次记录的分数 ScoreSchema new Schema userID type String
  • C++中继承私有成员

    假设一个类具有私有数据成员 但 setter 和 getter 位于公共范围内 如果从此类继承 您仍然可以调用这些 setter 和 getter 从而能够访问基类中的私有数据成员 既然提到派生类不能继承私有数据成员 这怎么可能 派生类不继
  • 将多个变量传递给内容脚本 chrome

    我正在编写我的第一个 chrome 扩展 几个小时前才开始 当硬编码时一切都运行良好 本质上 我正在填写一份 8 页的表格 表单的每个页面对应一个单独的内容脚本 内容脚本过去看起来像这样 查找字段有点困难 因为它们不是标准的 但我并不担心
  • 按照惯例,Java .class 文件存储在哪里?

    我有一个 Java src 文件夹 在其中存储 java 文件 然后 我使用终端编译它们 并最终在同一目录中获取 class 文件 这不一定会困扰我 但我从未见过专业人士这样做过 按照专业惯例 如果存在 应将编译后的 class 文件存储在
  • 如何在flutter中实现自定义对话框?

    我是 flutter 新手 需要创建一个图库应用程序 该应用程序需要自定义对话框来显示所选图像 我怎样才能实现呢 使用 Flutter 中 AlertDialog 类的父类 Dialog 类 对话框小部件有一个参数 shape 您可以使用它
  • MATLAB - 具有布尔值的棘手颂歌系统

    编辑 感谢您的支持 现在我终于添加了图像 添加了完整的 m file 尽管我认为没有必要 代码的关键是 xp 2 x 2 gt X2 xp 3 gt 0 xp 3 x 3 gt X3 xp 2 gt 0 完整代码 function xp u
  • Guice的injectMembers方法

    我了解使用构造函数注入相对于 setter 注入的好处 但在某些情况下我必须坚持仅使用基于 setter 的注入 我的问题是如何使用注入所有基于设置器的注入类的成员injector injectMembers method I am cal
  • getGenericParameterTypes 和 getParameterTypes 之间的区别

    我正在尝试了解之间的区别getGenericParameterTypes and getParameterTypes方法 我知道有人回来了Class 和另一个Type 但真正的区别是什么 考虑方法 public void method1 T
  • Git克隆存储库错误:RPC失败;结果=56,HTTP 代码=200

    我已经使用 Git 存储库几年了 但仍然感觉像个新手 非常欢迎帮助 它开始克隆一段时间 remote Counting objects 22394 br remote Compressing objects 100 12314 12314
  • iconv 返回奇怪的结果

    我正在研究一种方法来解决在 PHP 中创建帐户的自动脚本中使用特殊字符的问题 由于电子邮件地址和其他地方不需要特殊字符 因此我试图删除它们 但在将它们提供给脚本之前我无法删除它们 因为用户名必须正确显示给其他用户 例子 J rgen G t
  • scala 类中属性的可见性

    我通过以下方式在类的构造函数中定义了一个属性 class Step val message String 当我尝试访问时message从 Java 代码中获取可见性错误的值 为什么 如果添加 scala reflect BeanProper
  • 块递归和破坏保留周期

    为了更好地说明问题 请考虑以下块递归的简化形式 block void next int int index if index 3 return int i index next i next 0 XCode 启用 ARC 警告 在此块中强烈