使用 ARC 在其自己的完成块中引用 NSOperation 对象

2024-03-03

我在将一些 NSOperation 代码转换为 ARC 时遇到困难。我的操作对象使用一个完成块,该完成块又包含一个更新主线程上的 UI 的 GCD 块。因为我从操作对象自己的完成块内部引用操作对象,所以我使用 __weak 指针来避免内存泄漏。但是,当我的代码运行时,指针已经设置为 nil。

我已将范围缩小到此代码示例。有人知道我哪里出错了,以及实现这一目标的正确方法吗?

NSOperationSubclass *operation = [[NSOperationSubclass alloc] init];
__weak NSOperationSubclass *weakOperation = operation;

[operation setCompletionBlock:^{
    dispatch_async( dispatch_get_main_queue(), ^{

        // fails the check
        NSAssert( weakOperation != nil, @"pointer is nil" );

        ...
    });
}];

另一种选择是:

NSOperationSubclass *operation = [[NSOperationSubclass alloc] init];
__weak NSOperationSubclass *weakOperation = operation;

[operation setCompletionBlock:^{
    NSOperationSubclass *strongOperation = weakOperation;

    dispatch_async(dispatch_get_main_queue(), ^{
        assert(strongOperation != nil);
        ...
    });
}];

[operationQueue addOperation:operation];

我假设您还将操作对象添加到 NSOperationQueue 中。在这种情况下,队列将保留一个操作。它可能也在完成块的执行期间保留它(尽管我还没有找到有关完成块的官方确认)。

但在完成块内部会创建另一个块。该块将在稍后的某个时间点运行,可能是在 NSOperations 的完成块运行结束之后。当这个情况发生时,operation将被队列释放并且weakOperationnil。但是,如果我们从操作的完成块创建对同一对象的另一个强引用,我们将确保operation当第二个块运行时将存在,并避免保留循环,因为我们不捕获operation块的变量。

Apple 在中提供了此示例过渡到 ARC 发行说明 http://developer.apple.com/library/mac/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html请参阅最后一个代码片段使用生命周期限定符避免强引用循环部分。

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

使用 ARC 在其自己的完成块中引用 NSOperation 对象 的相关文章

  • Access / Word 2010 VBA 邮件合并尝试打开 [文件夹名称].mdb 而不是 ACCDB 源

    我们正在尝试从 Access 中自动执行邮件合并过程 单击按钮后 VBA 将运行指定当前数据库 accdb 作为数据源并运行 SQL 具体代码如下 Set up Word Dim objWord As Object Set objWord
  • 在 GWT 中,在任何主机页标记上添加事件处理程序

    我想为任何标签添加 MouseOver 事件处理程序 举个例子 我想为旧版 HTML 页面中的每个锚点页面添加事件处理程序 继GWT指南 http code google com webtoolkit doc 1 6 DevGuideUse
  • 如何为 Windows toast 注册协议?

    如何注册 Windows toast 协议 样本中来自https blogs msdn microsoft com tiles and toasts 2015 07 02 adaptive and interactive toast not
  • 使用 crypt() 加密

    我目前正在做一个非常安全的登录系统 但我是 crypt 函数的新手 需要一些快速帮助 我在注册过程中使用 crypt 加密密码字符串并将其保存到数据库中 但是 我如何在登录过程中解密密钥 或者我应该怎么做 或者是否可以对提交的密码字符串进行
  • 带重定向标准流的 C# + telnet 进程立即退出

    我正在尝试用 C 做一个 脚本化 telnet 项目 有点类似于Tcl期望 http expect nist gov 我需要为其启动 telnet 进程并重定向 和处理 其 stdin stdout 流 问题是 生成的 telnet 进程在
  • 您可以使用关键字参数而不提供默认值吗?

    我习惯于在 Python 中使用这样的函数 方法定义 def my function arg1 None arg2 default do stuff here 如果我不供应arg1 or arg2 那么默认值None or default
  • Android ScrollView fillViewport 不工作

    我有一个简单的布局 名称位于顶部 按钮位于屏幕底部 或者超出该按钮 以防我添加更多项目 所以我使用带有 LinearLayout 的 ScrollView 如下所示
  • Scrapy Spider不存储状态(持久状态)

    您好 有一个基本的蜘蛛 可以运行以获取给定域上的所有链接 我想确保它保持其状态 以便它可以从离开的位置恢复 我已按照给定的网址进行操作http doc scrapy org en latest topics jobs html http d
  • Googletest:如何异步运行测试?

    考虑到一个包含数千个测试的大型项目 其中一些测试需要几分钟才能完成 如果按顺序执行 整套测试需要一个多小时才能完成 通过并行执行测试可以减少测试时间 据我所知 没有办法直接从 googletest mock 做到这一点 就像 async选项
  • NGinx $proxy_add_x_forwarded_for 和 real_ip_header

    我在 NGinx 下有一个 web 应用程序和另一个前端负载均衡器 如下所示 x x x x IP 地址 客户端 a a a a gt LB b b b b gt NGX c c c c gt WEBAPP d d d d 这是我的 NGi
  • 自定义 Visual Studio 2008 中的位置栏

    有人成功定制了 VS 2008 的 Places Bar 吗 我从 VS 2005 进行的自定义设置并没有转移到 2008 显然 并且无论我如何处理注册表 我都无法使我的自定义位置出现在 打开 对话框中 我已经阅读并应用了相关的MS KB文
  • 是否可以在 C# 中强制接口实现为虚拟?

    我今天遇到了一个问题 试图重写尚未声明为虚拟的接口方法的实现 在这种情况下 我无法更改接口或基本实现 而必须尝试其他方法 但我想知道是否有一种方法可以强制类使用虚拟方法实现接口 Example interface IBuilder
  • 匿名结构体作为返回类型

    下面的代码编译得很好VC 19 00 23506 http rextester com GMUP11493 标志 Wall WX Za 与VC 19 10 25109 0 标志 Wall WX Za permissive 这可以在以下位置检
  • 使用泛型全面实现特征

    我正在通过实现矩阵数学来练习 Rust 但遇到了一些障碍 我定义了我认为与矩阵相关的特征 trait Matrix
  • Android:如何检测手机设置中的语言已更改

    我如何检测我的手机语言是否已更改 例如 Facebook 应用程序将向我们宣布 please wait we preparing your language i used myString Locale getDefault getDisp
  • Android 和 Java 中绘制椭圆的区别

    在Java中由于某种原因Ellipse2D Double使用参数 height width x y 当我创建一个RectF在Android中参数是 left top right bottom 所以我对适应差异有点困惑 如果在 Java 中创
  • 保存符号方程以供以后使用?

    From here http www mathworks com help releases R2011a toolbox symbolic brvfu8o 1 html brvfxem 1 我正在尝试求解这样的符号方程组 syms x y
  • 如果产品重量超过1000克,如何以公斤为单位显示

    在 Storefront 主题中 我使用下面的代码将格式化重量从 1000g 更改为 1kg add action woocommerce after shop loop item title show weight 10 function
  • android ndk 硬件调试内存

    背景 我对 C 很有经验 对 Android 和 Java 还很陌生 但这是编程的环境问题 我已经用 ANSI C 开发了一个管理应用程序 可以移植到任何操作系统 只需在依赖于操作系统的代码中添加 UI 即可 它使用相当多的内存 特别是对于
  • CUDA 中指令重放的其他原因

    这是我从 nvprof CUDA 5 5 获得的输出 Invocations Metric Name Metric Description Min Max Avg Device Tesla K40c 0 Kernel MyKernel do

随机推荐

  • C#命令获取结构偏移量?

    假设我有一个像这样的 C 结构 StructLayout LayoutKind Explicit struct IMAGE DOS HEADER FieldOffset 60 public int e lfanew 现在假设我从文件中读取数
  • 无法使用 MinGW 构建 Boost,它会寻找 Visual C++

    起初 我尝试使用以下命令构建安装了 MinGW 和 Microsoft Visual C 的 Boost bootstrap bat mingw b2 在构建过程中 我收到了大量日志行 表明构建是针对 Visual C msvc 完成的 所
  • 有没有办法让类名与表名不同?

    我们正在使用几年前创建的数据库 并且希望保持表名称相同 我们所有的表都命名为 tbl Orders 但我们希望模型 控制器等的类名称为 Orders OrdersController 等 我们使用实体框架将类映射到我们的表 抱歉 如果之前有
  • 通过反射访问Java中的私有变量[重复]

    这个问题在这里已经有答案了 我正在尝试编写一个方法 该方法将使用反射在类中获取私有字段 这是我的课程 针对此示例进行了简化 public class SomeClass private int myField public SomeClas
  • 从字符串值设置 Android 图像

    目前我正在 Android 应用程序中绘制 PNG 图像 如下所示 ImageView image new ImageView context image setImageDrawable context getResources getD
  • 向 FormBuilder 添加一个方法,该方法调用呈现部分的辅助方法

    所以我有这个辅助方法 对吧 def table form field name or options nil args block render partial gt snippets table form field locals gt
  • 如何从 webview 打开 safari 移动应用程序中的链接

    这里有很多主题 但它们都需要本机代码交互才能工作 就我而言 有必要能够直接从 URL 执行此操作 而无需与我的移动应用程序进行任何交互 I tried a href target blank Open Google in Safari a
  • 创建非活动 C# WPF 窗口的缩略图

    我在这里浏览了许多主题 并通过谷歌搜索了信息 但没有找到与我的问题相关的任何内容 我想要做的是拥有它 以便当用户启动应用程序时 主窗口 不是 MDI 将打开并显示四个图像框 每个图像框显示当他们单击它时将打开的表单图像 一旦选定的表单打开并
  • 从 C# 运行带有参数的命令行?

    可以使用如下命令在 C 中运行命令行 process new Process process StartInfo FileName command process Start 问题是命令字符串是否包含参数 例如 C My Dir MyFil
  • Ada95 中的线程和信号量

    如何在 Ada95 中使用线程 我可以使用哪些函数来创建 销毁 停止和启动它们 我如何在这种语言中使用信号量 并发性内置于该语言中 因此您可以为任务 即线程 和受保护对象 即比信号量 互斥体 条件变量更强大 使用特定的 Ada 语法 这使得
  • 如何在按钮上添加图像(左)和文本

    如何在按钮上添加图像 左 和文本 举例说明 use android drawableLeft drawable image 在你的布局 xml 中 你也可以从代码中做到这一点 Drawable icon getContext getReso
  • 未调用委托方法“clickedButtonAtIndex:”

    我使用以下代码创建了一个带有两个按钮的警报视图 UIAlertView alertView UIAlertView alloc initWithTitle title message msg delegate nil cancelButto
  • 已删除的类会丢弃错误消息未知>:0:错误:没有这样的文件或目录:

    因此 我和一些朋友正在从事 bitbucket 项目 并且已经意识到 bitbucket 有时不会同步所有文件 但事情是这样的 我继续工作并创建了一个类 我基本上复制了一个旧的视图控制器 称为WelcomescreenViewControl
  • 如何在Unity中制作2D动画

    因此 我正在 Unity 中为 Android 和 iOS 儿童制作 3D 游戏 但我是游戏开发新手 规划资源确实很困难 我们需要创建 2D 动画 纸质角色 并且角色必须具有出色的动画细节 我们一直在考虑几种选择 我们可以创建逐帧动画 但我
  • 使用 AWS Cloudfront 的 hls.js CORS 存在 Cookie 问题

    我正在尝试使用 Cloudfront HLS 功能设置视频流 但我无法让 Hls js 在请求中发送我的凭据 cookie 我已经将 Cloudfront 配置为转发 cookie 和转发访问控制标头 我还设置了 S3 CORS 策略以包括
  • 什么时候在 Java 中使用可变参数?

    我害怕可变参数 我不知道用它们做什么 另外 让人们想传递多少参数就感觉很危险 适合使用它们的上下文示例是什么 Varargs are useful对于任何需要处理的方法不确定数量的物体 一个很好的例子是String format http
  • 使用正则表达式 python 查找电子邮件[重复]

    这个问题在这里已经有答案了 我想在文本文件中查找有效的电子邮件地址 这是我的代码 email re findall r a zA Z w line 但我的代码显然不包含 符号之前有数字的电子邮件地址 我的代码无法处理没有有效结尾的电子邮件地
  • docker build 和 docker run 后如何访问 my falcon 应用程序?

    作为后续问题Docker运行找不到可执行文件 uwsgi https stackoverflow com questions 49073975 docker run cannot find executable uwsgi 我已经成功执行了
  • 聚焦于 UISearchBar 但键盘不出现

    我已经阅读了很多关于如何在打开搜索视图时聚焦搜索栏以使键盘出现的解决方案 所有这些都是这样的 searchBar becomeFirstResponder mine is self searchDisplayController searc
  • 使用 ARC 在其自己的完成块中引用 NSOperation 对象

    我在将一些 NSOperation 代码转换为 ARC 时遇到困难 我的操作对象使用一个完成块 该完成块又包含一个更新主线程上的 UI 的 GCD 块 因为我从操作对象自己的完成块内部引用操作对象 所以我使用 weak 指针来避免内存泄漏