将 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函数

    如何在回调函数中调用目标c函数 回调函数 static OSStatus inputRenderCallback void inRefCon AudioUnitRenderActionFlags ioActionFlags const Au
  • C++ 装饰器模式,模板的静态多态性和注册回调方法

    我正在尝试使用静态多态性来创建装饰器模式 至于为什么我不使用动态多态 请看这个QA https stackoverflow com questions 39312070 c dynamic cast over decorator insta
  • 如何为图层阴影不透明度设置动画?

    我有一个视图 我已将 LayerOpacity 设置为 1 theView layer shadowOpacity 1 0 当视图位于屏幕下方时 这看起来很好 当我将此视图向上移动以与另一个有阴影的视图齐平时 它们看起来不太好 有没有办法让
  • 如何检索 iPhone 的区域设置

    我用谷歌搜索过它 但令我有点惊讶的是我找不到它 我只想访问设备配置的区域设置 我试图找到如何列出所有系统属性 以防我能在那里找到区域设置 但甚至找不到如何做到这一点 我知道 认为 我之前检索过系统属性 但我也记得在谷歌搜索时找到该信息并不容
  • 子类 PFObject 上的 PFUser 属性

    我使用以下类 动态属性以及 m 文件中的 load 和 parseClassName 方法 对 PFObject 进行了子类化 interface DAOpponents PFObject
  • 对象指针值作为字典的键

    我想使用对象的引用值作为字典的键 而不是对象值的副本 因此 我本质上想在字典中存储与另一个对象的特定实例关联的对象 并稍后检索该值 这可能吗 是不是完全违背了NSDictionary的理念 我可以看出我可能以错误的方式处理这个问题 因为字典
  • C 中使用指针的结构冒泡排序

    我想使用 C 中的冒泡排序算法和指针对结构数组进行排序 我有一个汽车结构 typedef struct char model 30 int hp int price cars 我为 12 个项目分配内存 cars pointer cars
  • Cython:如何在结构中公开 void* 和函数指针?

    我有一个 C 标头 typedef struct
  • 如何去掉 UIWebView 上的状态栏背景?

    从 iOS 11 开始 当UIWebView全屏时 状态栏上会出现与屏幕颜色相同的假背景UIWebView背景 有人知道如何摆脱它吗 甚至添加IUWebView到故事板并使其全屏将使状态栏背景出现 我一直在尝试编辑 UIWebView 的大
  • 更改导航项(栏)的背景颜色

    有没有一种简单的方法可以更改视图顶部导航项的背景颜色 我有一个基于导航的应用程序 我只希望一个视图获得另一种背景颜色 我主要使用 IB 创建视图 我找到了以下解决方案 未测试 float r 10 float g 55 float b 13
  • 高效创建 x 层深度的嵌套 for 循环

    这可能是一件简单的事情 但我需要创建一个循环结构 使其循环 y x 次以创建 x 和 y 的所有可能组合 例如 如果有 4 个 x 每个 x 有 2 个 y 我想做这样的事情 for int a 0 a lt y a for int b 0
  • iOS 视图控制器内存在被关闭后未释放

    当用户单击按钮时 它会显示一个带有两个视图控制器的新选项卡栏视图控制器 我是这样做的 ACLevelDownloadController dvc ACLevelDownloadController alloc initWithNibName
  • 自定义 UITableViewCell 选择样式?

    当我点击我的UITableViewCell 当我单击单元格时 背景部分 我的背景图像未覆盖的区域 会变成蓝色 另外 所有的UILabel单击时单元格上的 s 变为白色 这就是我想要的 然而 我不想要的是当我点击它时的蓝色背景 但如果我这样做
  • 确定 Objective-C 方法在运行时是否是可变的

    有没有办法在运行时找出给定方法是否是可变参数类型 就像是method getTypeEncoding 这不会告诉我一个方法是否接受可变数量的参数 或者有什么技巧可以告诉我们吗 罗伯特的评论是正确的 考虑 interface Boogity
  • iOS 中的 CSV 逐行解析

    我正在 Objective c 中解析 CSV 文件 该文件包含如下内容 line 40 Rising searches line 41 nabi avc Breakout line 42 stonewall 700 line 43 med
  • 关于窗口层次结构的警告

    我的调试器中出现这样的警告 这是什么意思 Warning Attempt to present
  • 在 Swift 中使用 CommonCrypto 解密时出现问题

    我在一家Swift only加密 解密Extension for String and NSData 并且 crypt 部分的工作基于 Zaph 在链接问题中提供的答案 在 Swift 中使用 CCCrypt CommonCrypt 时出现
  • 为什么 Double 不能隐式转换为 Decimal

    我不明白十进制和双精度的转换规则 这样做是合法的 decimal dec 10 double doub double dec 然而令我困惑的是 decimal 是 16 字节的数据类型 而 double 是 8 字节 因此将 double
  • CLI/C++:void* 到 System::Object

    这是一个类似的问题这个帖子 https stackoverflow com questions 1154929 void to object in c cli 我一直无法用它来解决我的问题 我在这里包含了一些代码 希望能帮助某人了解其他帖子
  • 拖动时获取MKAnnotation的坐标

    我正在根据用户添加的注释的位置创建一条路径 MKPolyline 我想允许用户通过拖动引脚来更改路径 我目前可以做到这一点 但 MKPolyline 不会更新 直到引脚被放下 我实施了 void mapView MKMapView mapV

随机推荐

  • 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 类中调用的 该函数传递一个指向回调 类中的函数 的指针和一个引用 该引用是必要的 因为回调是静态调用的 因此没有上下文