将 Objective-C 对象作为 void * 指针传递给函数

2024-02-26

我有一个功能:

  myFunction (MyProc callback, void * ref)

该函数是从 Objective-C 类中调用的。该函数传递一个指向回调(类中的函数)的指针和一个引用。该引用是必要的,因为回调是静态调用的,因此没有上下文。 ref 可用于为回调提供上下文。

我希望能够通过 Objective-C 类作为参考。所以问题是:

如何将 NSObject 转换为 void * 以及如何将 void * 转换为 NSObject。

提前致谢。


做这样的事情:

void func(void *q)
{
    NSObject* o = CFBridgingRelease(q);
    NSLog(@"%@", o);
}

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        NSObject* o = [NSObject new];
        func((void*)CFBridgingRetain(o));
    }
    return 0;
}

注意CFBridgingRetain() and CFBridgingRelease()是围绕编译器属性的宏。请随意使用。我喜欢 API 变体,因为它在我们的代码库中更常用,而且更明确/更少混乱。

CFBridgingRetain()有效地硬保留必须通过平衡来平衡的物体CFBridgingRelease()。它也恰好返回一个CFTypeRef which is与强制转换兼容void*. CFBridgingRelease()有效地消除了这种硬保留,因此,q仅在以下范围内有效o已验证。

对于基本回调有效,但你可能不会用void *context;键入必须保留一段时间的内容。为了那个原因:

void callback(void *context)
{
    // grab an ARC aware reference without impacting hard-retain
    NSObject* o = (__bridge NSObject *)(context);
    NSLog(@"%@", o);
}

void freeContext(void *context)
{
    // release the hard-retain
    CFBridgingRelease(context);
}

请注意,如果您省略了强制转换/API 调用,Xcode 会很好地准确地建议您应该做什么。它甚至解释了每个替代解决方案的含义(我非常依赖这一点,直到我能够将它们牢记在心)。

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

将 Objective-C 对象作为 void * 指针传递给函数 的相关文章

  • C++ 引用类型作为 Objective-C++ 中的实例变量

    Objective C 中禁止将 C 引用类型用作实例变量 我该如何解决这个问题 您不能明智地使用引用作为实例变量 因为无法初始化实例变量并且无法重新放置引用 另一种选择可能是简单地使用 可能是智能的 指针 另一种让您更接近 C 行为的可能
  • 循环缓冲区录音 iOS:可能吗?

    我的一个客户想要连续录制音频 当他单击 提交 时 他只想提交最后 10 秒的内容 所以他想要连续记录并且只保留最后 x 秒 我认为这需要类似循环缓冲区的东西 但是 作为 iOS 的新手 它看起来像AVAudioRecorder只能写入文件
  • 将 NSString 的 NSArray 转换为 NSNumber 的更好方法

    考虑下面的代码 NSString param string 1 3 6 10 15 22 28 30 NSArray params param string componentsSeparatedByString NSNumberForma
  • 如何手动(按位)执行(浮动)x?

    现在 这是我应该实现的函数的函数头 float from int Return bit level equivalent of expression float x Result is returned as unsigned int bu
  • 在没有双精度类型的 C 编译器上解析双精度 IEEE 浮点

    我正在使用 8 位 AVR 芯片 64 位双精度数没有数据类型 双精度数仅映射到 32 位浮点数 但是 我将通过串行接收 64 位双精度数 并且需要通过串行输出 64 位双精度数 如何将 64 位双精度数转换为 32 位浮点数并在不进行转换
  • 无法将新地址分配给函数中的指针? [复制]

    这个问题在这里已经有答案了 不久前 我有一个编程作业 偶然发现了这个小问题 当我给一个函数一个指针作为参数时 我无法更改它指向的地址 我通过返回我想要指针指向的新地址解决了这个问题 但我仍然想知道为什么不可能操作指针参数 因为所有内存分配函
  • 如何在iPhone应用程序中的类结构中实现主键和外键表数据[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何连接sqlite数据库中的两个表数据 if sqlite3 open dbPath UTF8String database SQL
  • 从视频创建缩略图 - 提高速度性能 - AVAsset - iPhone [重复]

    这个问题在这里已经有答案了 我正在使用基于以下线程中的代码的代码来生成视频缩略图 从 iPhone SDK 中的视频 URL 或数据获取缩略图 https stackoverflow com questions 1347562 gettin
  • 创建类似于邮件应用程序菜单的 iPhone 弹出菜单

    当您想要回复消息时 我想创建一个类似于邮件应用程序中的弹出菜单 我在多个应用程序中看到过这一点 所以我不确定框架中是否内置了某些内容或一些示例代码 在 Swift 中创建操作表 代码已使用 Swift 5 进行测试 从 iOS 8 开始 U
  • UITableview 中的水平和垂直滚动[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 I want to make a lineup for a festival You can see what I want to a
  • 将第 3 方库 ZXing 导入 Xcode

    我尝试了多种方法将第 3 方库 ZXing 导入我的 iOS 应用程序 但所有方法都很痛苦 或者根本不起作用 如果有人可以建议我做错了什么 或者提出导入 ZXing 等库的更好方法 我将非常感激 一定比这个容易 这就是我所做的 结果是 My
  • 如何从尖点库矩阵格式获取原始指针

    我需要从尖点库矩阵格式获取原始指针 例如 cusp coo matrix
  • 在 uilabel 中查找文本的位置 {x,y}

    我有一个来自服务器的字符串 我正在 UILabel multiligne 上显示它 在该字符串中 我正在识别一些特定的子字符串 我想在该子字符串上放置一个按钮 按钮将是 UILabel 的子视图 为此 我需要子字符串坐标 我经历过这个 但我
  • 您是否标记 UIView 或将它们保留为属性?

    这主要是一个风格问题 但自从我开始为 iPhone 编程以来 我一直很好奇其他人的想法是什么 当您的 iPhone 应用程序中有一个 UIView 并且需要在应用程序的其他位置访问它时 通常在视图控制器中的另一个函数中 您是否喜欢用整数标记
  • 如何在 NSMutableArray 中实现“按值分组”?

    我正在使用 NSMutableArray 我想像在 SQL 中那样按日期获取值group by log date logMuArray log currenttime 4 30pm log date 11 12 2011 log durat
  • 在 Objective-C 中比较 2 个字符串

    我写了以下代码 if depSelectedIndice gt 1 comSelectedIndice gt 1 NSLog depart elemet d depSelectedIndice NSLog depart elemet d c
  • 在 XCode 中链接静态 ObjC 库的过程

    我正在尝试链接到静态库 但不断收到链接器错误 我发现了一些发布示例的网站 但我无法看到我做错了什么 首先 我创建一个链接到我的库的项目 添加 gt 现有文件找到我的 xcodeproj 文件选择 将项目复制到目标组文件夹 选择我的宿主项目作
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 在 Objective C 的类方法中引用类本身

    我希望我没有跳过 ObjC 手册中的这一部分 但是是否可以从类的一个类方法中引用该类 就像在 PHP 中一样 您将使用 this 来引用当前实例 而 self 引用实例的类 this 的 ObjC 等价物将是 self 那么 PHP 的 s
  • 如何将 ios7 通用应用程序升级到基于 Xcode 6 的通用故事板应用程序?

    我目前有一个基于 xcode 5 ios 7 的通用应用程序 因此有两个故事板 我正在考虑将其更新到 ios 8 有没有办法 最佳方法将两个故事板迁移到通用的单个故事板 我在 xcode 6 中看不到转换选项 None

随机推荐

  • SSE 双线性插值

    我正在紧密循环中实现双线性插值 并尝试使用 SSE 对其进行优化 但我从中得到的加速为零 这是代码 非 SIMD 版本使用简单的向量结构 可以定义为struct Vec3f float x y z 实现乘法和加法运算符 ifdef USE
  • 禁用时更改开关颜色

    我有一个开关 当启用并选中时 它的颜色是我的 colorPrimary 我希望在检查但禁用时具有相同的颜色 但我找不到完成它的方法 我尝试使用选择器 但它改变了开关背景而不是切换本身 如何更改开关颜色 Thanks 1 在 styles x
  • 复选框确认消息 - 如果为 false,则保持选中状态

    我目前正在尝试在用户尝试取消选择选项时添加 JavaScript 确认消息 如果用户在确认屏幕上选择取消 则该复选框应保持选中状态 我遇到的问题是 即使我返回 false 该复选框也不会被选中 代码示例可以在这里找到http jsfiddl
  • 使用 python 的 CentOS 上的 Hadoop 流示例 - /mapred/local/taskTracker 上的权限被拒绝

    我已经能够使用 python 映射器和减速器设置流示例 mapred文件夹位置是 mapred local taskTracker root 和 mapred 用户都拥有此文件夹和子文件夹的所有权 但是 当我运行流式传输时 它会创建地图但不
  • NSString 中某个字符出现的次数

    我有一个NSString or NSMutableString并希望获得特定字符出现的次数 我需要对相当多的字符 在本例中为大写英文字符 执行此操作 所以速度快一点就好了 您可以在一行中完成此操作 例如 计算空格数 NSUInteger n
  • 我可以使用循环来最小化 ES6 import 语句吗?

    我检查了文档中的 导入 觉得不可能像数组元素一样对待导入的名称 欢迎任何处理这种情况的建议 import C1 from samples sample1 import C3 from samples sample3 import C4 fr
  • Drupal 对数据库执行查询

    我希望从我的 drupal 数据库中检索一些 nid 我有一个想要运行的查询 SELECT node nid AS projectnid FROM node node INNER JOIN content type project node
  • Xcode 13 中的 Info.plist 在哪里? (缺失,不在项目导航器内)

    有谁知道如何添加 编辑值Info plistXcode 13 还没到吗 我看到他们移动了Info plist从导航器窗格 但是虽然我可以找到它 但我不知道如何编辑它 这是一个 功能 你不再需要它了 来自发行说明 https develope
  • 运行进程时隐藏 vb.net 中的命令窗口

    如果我有这个代码 Send file to Unix server via pscp Dim Proc As New System Diagnostics Process Proc StartInfo New ProcessStartInf
  • 不小心把代码发布了。如何防止再次发生?

    最近我们发生了一起事件 一些原本没有计划发布的代码被发布了 显然它已经被托运到行李箱里了 我想这很好 如你所愿 提早入住 经常入住 然而在这种情况下 它不应该在下一个版本中发布 可以采取什么样的检查 策略 流程来避免代码过早发布 在我看来
  • 使用 Post/Redirect/Get 模式保留模型状态

    目前我正在尝试使用 Spring MVC 3 1 实现 Post Redirect Get 模式 保存和恢复模型数据 验证错误的正确方法是什么 我知道我可以在 POST 方法中使用 RedirectAttributes 保留模型和 Bind
  • Python 在标签正则表达式处分割

    我正在尝试拆分这些行
  • SQL 中的 LIMIT 语句有多通用?

    我正在推广 Django DB 复制应用程序 它使用以下语句 SELECT s FROM s LIMIT 1 获取 1 行并使用 Python DBAPI 来描述字段 它可以在 ORACLE 和 MySQL 中正常工作 但是 LIMIT 语
  • 创建共现矩阵

    我正在尝试解决共现矩阵的问题 我有一个交易和项目的数据文件 我想查看项目一起出现的交易数量的矩阵 我是 R 编程的新手 我很高兴发现 R 拥有的所有快捷方式 而不是创建特定的循环 我几年前曾经使用 C 现在只坚持使用 Excel 宏和 SP
  • H264解析-切片头检测

    我知道在 h264 中我们可以通过位模式检测 NAL 单元0x000001 是否有等效的方法来检测 NAL 单元中的切片标头 如何处理多切片 NAL 单元 目前我正在使用 h264 的解析代码并获取相应结构中的切片标头 切片头语法在第 36
  • 模式匹配 - Prolog 与 Haskell

    这不是一个家庭作业问题 而是一个考试学习指导问题 Prolog 与 Haskell 中的模式匹配有什么区别 我做了一些研究并阅读了它们背后的理论并没有真正让我对两者有一个坚实的理解 我在Prolog中读到 模式匹配是不同的 因为它具有统一变
  • 需要更好的算法来查找 2 组具有最小距离的点之间的映射

    Problem 我有两个重叠的 2D 形状 A 和 B 每个形状具有相同数量的像素 但形状不同 形状的某些部分是重叠的 而每个形状的某些部分是不重叠的 我的目标是将形状 A 中的所有不重叠像素移动到形状 B 中的不重叠像素 由于每个形状中的
  • 网站图像文件是否应该包含在 GIT 存储库中?

    我有一个网站文件 文件夹结构模板可以开始使用git 它包含一个空的 gitignore文件内的images文件夹 这引出了我的两部分问题 1 这个是空的吗 gitignore文件忽略所有位于的图像inside the images文件夹 或
  • Pandas 就地操作 DataFrame 与非就地操作 DataFrame (inplace=True vs False) [重复]

    这个问题在这里已经有答案了 我想知道当我们选择就地操作数据帧时 与没到位 我在 Stack Overflow 上做了一些搜索 发现了这个post https stackoverflow com questions 43893457 pyth
  • 将 Objective-C 对象作为 void * 指针传递给函数

    我有一个功能 myFunction MyProc callback void ref 该函数是从 Objective C 类中调用的 该函数传递一个指向回调 类中的函数 的指针和一个引用 该引用是必要的 因为回调是静态调用的 因此没有上下文