如何将数组传递给需要 var args 的 objc 方法(例如...')

2024-03-11

我在库中有一个方法,如下所示:

- (id)initWithSomeObjects:(NSString *)something, ... NS_REQUIRES_NIL_TERMINATION;

我真的很想用数组而不是 var args 来调用它,因为我想传入的对象数量是可变的。

有没有什么方法,使用performSelector或NSInitation或objc_msgSend或其他什么,我可以调用var args方法,参数来自数组?


没有简单的方法可以做到这一点,因为如何传递参数涉及特定系统调用 ABI 的丑陋细节,并且您必须知道例如有多少个参数被放入寄存器,如何处理剩余的参数等等。这会涉及到汇编,不能用通用的方式来完成。

一般来说,任何具有像这样采用可变参数的方法或函数的 API,也会

  1. 提供另一种方法,该方法需要va_list参数代替(例如-[NSString initWithFormat:] has -[NSString initWithFormat:arguments:])。如果是这种情况,那么您可以使用该技术来构造va_list来自您在评论中链接到的文章。 (甚至构建va_list是系统特定的且不可移植的。但至少它可以在 Mac 和 iPhone 上运行,而且做起来相当简单,而且不涉及组装。)
  2. 提供另一种方法,该方法需要NSArray *或 C 元素数组(例如-[NSArray initWithObjects:] has -[NSArray initWithObjects:count:])
  3. 具有逐个添加元素的方法,这样整体效果与将它们全部传递给 varargs 方法相同(例如,末尾的 varargs 按钮标题-[UIAlertView initWithTitle:message:delegate:cancelButtonTitle:otherButtonTitles:]可以通过调用来实现-[UIAlertView addButtonWithTitle:]多次)。

如果您的 varargs API 没有上述之一,那么它就是一个设计糟糕的 API,您应该向编写它的人抱怨。如果你真的遇到这种情况,我猜测可以使用像 libffi 这样的东西,它允许你动态地进行函数调用,并处理依赖于系统的调用机制的细节。

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

如何将数组传递给需要 var args 的 objc 方法(例如...') 的相关文章

  • 如何在 Objective C 中使用 swift 文件

    我想在 Objective C 代码中使用我的 Swift 文件 我找到了不同的链接 说明了如何操作 我的项目名称是 测试项目 我将 import Test Project Swift h 导入到我的 m 文件中 以在 Objective
  • 创建电子书阅读应用程序的教程 - epub 文件格式 [重复]

    这个问题在这里已经有答案了 我正在制作一个电子书阅读应用程序 因为我想执行一些操作 例如更改文本颜色 字体 选择文本等 我知道 iphone os 4 0 和 ipad 现在支持 epub 文件格式 但我不知道如何创建此类应用程序 如果有人
  • ARC 禁止合成未指定所有权或存储的财产

    我创建了一个 property of UIColor property nonatomic UIColor color 然后我尝试合成它 synthesize color color 但我收到一个错误 ARC 禁止合成具有未指定所有权或存储
  • 我如何在 viewDidLoad 中执行 UIView animateWithDuration ? IOS 7

    我在 viewDidAppear 中尝试这个 但我有一秒钟的延迟 我能做什么 在 viewDidLoad 中工作 void viewDidAppear BOOL animated fullRotation CABasicAnimation
  • NSString keepCount 是 2147483647 [重复]

    这个问题在这里已经有答案了 可能的重复 NSString 保留计数 https stackoverflow com questions 1390334 nsstring retain count Objective C NSString 属
  • 如何在我的应用程序中添加应用内购买

    我想在我的应用程序中使用应用程序购买应用程序 但我不知道如何执行此操作 任何人都可以帮助我如何做以及源代码在哪里 给我链接或代码 这里有一堆链接 应用内购买编程指南 http developer apple com iphone libra
  • -all_load 其他链接器标志导致第 3 方框架中的重复符号错误

    我有一个用于内部应用程序的静态库 其中包含一些常见的实用程序代码 从以前的 SO 帖子中 我发现为了在运行时加载静态库中的类别 我需要包括 all load ObjC在 构建设置 中的 其他链接器标志 字段中 但是 对于我也在使用的闭源第三
  • 在 iOS 5 中,我们可以邀请人们使用我们的应用程序或通过 Facebook 从应用程序发送好友请求吗?

    考虑X and Y是朋友Facebook他们都在各自的手机中安装了一个应用程序 但他们在这一点上并不是朋友应用程序的好友列表 那么现在 可以X 发送好友请求 Use Facebook sdk 3 1 https developers fac
  • 如何使用 iOS 可达性

    我正在开发一个使用网络的 iPhone 应用程序 iPhone 通过 HTTP 请求与我的服务器通信 并且应该可以在 WiFi 和 3G 上运行 我目前使用NSURLConnection initWithRequest向我的服务器发送异步请
  • 使用 NSString 进行 UTF8 解码

    我是 Objective C 新手 尝试使用以下示例将格式错误的 UTF8 编码 NSString 转换为格式良好的字符串苹果文档 http developer apple com library mac documentation Coc
  • 为什么在 init 方法中使用双括号,或者是 1 == (1)?

    评估某些含义时括号有什么作用 我在代码中遇到过这个问题 当检查某些内容并且他们使用 if some condition that returns 1 code 所以我的问题是 这是否正确 我认为它总是错误的 因为 1 不返回任何东西 编辑
  • CALayer边框奇怪问题

    我正在向 CALayer 添加边框 但有一些奇怪的行为 在我应用的边框之后出现模糊边框 参见屏幕截图 这是我的代码 void configureLabel self hidden YES self textAlignment NSTextA
  • (Kiss)XML xpath 和默认命名空间

    我正在开发一个 iPhone 项目 需要解析一些 xml xml 可能包含也可能不包含默认名称空间 我需要知道如何解析 xml 以防它使用默认命名空间 由于我需要读取和写入 xml 因此我倾向于使用 KissXML 但我愿意接受建议 这是我
  • Cocoa 应用程序菜单栏不可点击

    我正在我的可可应用程序中构建一个菜单栏 其中包含以下代码 implementation我的自定义应用程序CustomApplication void setUpMenuBar CustomApplication sharedApplicat
  • 调整 UIImage 的大小而不将其完全加载到内存中?

    我正在开发一个应用程序 用户可以在其中尝试加载非常非常大的图像 这些图像首先在表格视图中显示为缩略图 我的原始代码会在大图像上崩溃 因此我重写它以首先将图像直接下载到磁盘 是否有一种已知的方法可以调整磁盘上图像的大小 而无需通过以下方式将其
  • UIPickerView selectRow 未按预期工作

    我创建了一个UIPickerView它有两个组件 第一个组件 A 的行数固定为 13 另一个组件 B 的行数可变 具体取决于 A 中选择的行 加载时UIPickerView我调用以下命令 以便我可以在两个组件中默认选择 但是我遇到的问题是只
  • iPhone:UIApplication WillResignActiveNotification 从未被调用

    我正在视图控制器中播放视频 当用户按下硬件主页按钮并且当前正在播放视频时 应用程序崩溃并显示EXC BAD ACCESS在模拟器中 我读到我应该使用applicationWillResignActive停止视频播放的消息应该可以解决崩溃问题
  • 为什么 Objective-C 允许在方法定义末尾使用分号? [复制]

    这个问题在这里已经有答案了 可能的重复 Objective C 实现文件中方法名后面的分号 https stackoverflow com questions 5678360 semicolon after the method name
  • 如何为 UIImageView 随机化器实现滑动手势

    我一直在浏览大量的教程和问题 但似乎找不到我要找的东西 我有一种感觉 我只是错过了一个简单的步骤 我仍在学习诀窍 所以请承受和我一起做这个 我正在 xcode 4 3 3 上制作图像随机化器 并且我已经能够使用按钮来随机化图像 但我希望它能
  • ios - 如何声明静态变量? [复制]

    这个问题在这里已经有答案了 C 中声明的静态变量如下 private const string Host http 80dfgf7c22634nbbfb82339d46 cloudapp net private const string S

随机推荐

  • C编码:只读取带小数的浮点数,拒绝整数和特殊字符

    我正在尝试用 C gcc 编写代码以仅接受带小数的浮点数并拒绝整数 特殊字符 字母数字条目 有效条目是 1 23 3 45 6 77 无效条目 abc e34 834ww 6 9 还有一些不是浮动的废话 这是我尝试过的 include
  • 如何获取 Rails 控制器中活动存储中存储的附件的 URL

    如何获取存储在 Rails 控制器的活动存储中的 has one 模型附件的 URL 因此 我可以将其作为完整链接作为 json 中的 api 发送 到目前为止 我已经尝试过以下方法 但每个方法都给出了不同的问题 current user
  • 组合两个 matplotlib 颜色图

    我想将两个颜色图合并为一个 这样我就可以使用一个cmap一个用于负值 另一个用于正值 目前 我使用屏蔽数组来完成此操作 并用一张图像绘制一张图像cmap以及另一个图像与另一个图像 结果是 有以下数据 dat np random rand 1
  • 使用 Clearcase 递归签入

    我想将一个目录和所有子目录签入到透明案例中 有具体的命令可以实现吗 目前我正在进入每个目录并手动检查每个文件 我会推荐这个问题 https stackoverflow com questions 33577 how do i perform
  • 如何在 JavaScript 中循环遍历 JSON 关联数组?

    我从服务器收到 JSON 响应 并且必须在 javascript 中循环遍历数组并获取值 但我似乎无法循环遍历它 数组的 JSON 响应如下所示 1 Schools 20 Profiles 31 Statistics 44 Messages
  • 在 Facelet 模板中包含非 Facelet 内容

    有没有办法将 html 文件的内容插入到 Facelet 模板中 Facelets 标签不起作用 因为它仅用于包含 Facelet 内容 换句话说 我正在寻找相当于 JSP include 指令的 Facelets 我可能不明白你需要什么
  • 如何等待一组异步回调函数?

    我的代码在 javascript 中看起来像这样 forloop async call returns an array to its callback 所有这些异步调用完成后 我想计算所有数组的最小值 我怎样才能等到他们所有人呢 我现在唯
  • TFS 电子邮件通知

    当我在 TFS 中添加错误 工作项 并将其分配给用户时 我希望向该用户发送一封电子邮件 此外 如果现有错误的 分配给 发生更改 我希望该用户收到一封电子邮件 当用户在 TFS 2008 中分配了更改的错误时 是否可以向用户发送警报 至少在
  • 指令在 Spray 中如何工作?

    我想了解 Spray 中的指令如何工作 根据文档 http spray io documentation 1 1 SNAPSHOT spray routing key concepts directives 指令的一般结构如下 name a
  • 通过WCF发送图像的有效方法?

    我正在通过从头开始编写 VNC 等自定义远程控制应用程序来学习 WCF LINQ 和其他一些技术 我创建它时考虑了三个主要目标 服务器将在应用程序级别 即无缝窗口 提供 远程控制 而不是完整的桌面访问 客户端可以选择服务器上运行的任意数量的
  • 内存分配和 **argv 参数[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我知道我们使用这个论证的目的 我什至知道如何使用这个论证 只有一件事我仍然不明白 程序如何为来自输入的字符串分配内存 argv 在程序开始时
  • Safari 11.0.3 无法识别内容安全策略哈希

    我有一个元标记 其中包含以下指令 然后 我在页面下方有 2 个内联脚本 每个脚本都应与策略中生成的 sha 之一匹配 在 Chrome 和 Firefox 中 我没有收到任何投诉 我的脚本按预期运行 在 Safari 版本 11 0 3 1
  • 在添加另一个标记之前检查现有标记

    谷歌地图 API v2当我等待另一个应用程序完成时 我出于兴趣创建了另一个应用程序 该应用程序一次只能将 1 个标记添加到地图中 我喜欢我做的地图 我目前有这段代码 如果标记已存在 它将清除地图 然后添加另一个标记 但我想要的是它显示一条消
  • `tools:replace="android:supportsRtl"` 可以与 `tools:ignore="AllowBackup"` 一起使用吗?

    正如张贴在https stackoverflow com a 39178185 3286489 https stackoverflow com a 39178185 3286489 解决如下错误 Error Execution failed
  • 当我单击外部提供商按钮时,为什么我的网站会重定向回登录屏幕?

    我正在将 ASP Net MVC4 站点升级到 MVC5 并在此过程中实现新的 OWIN 身份验证方法 我已从空白 MVC5 项目上的帐户控制器复制了操作方法 问题是 当我单击外部提供商按钮 例如 Google 时 我只是再次重定向回登录页
  • 文本文件中字符串中的两个单词

    我正在尝试在字符串中获取两个单词 但我不知道该怎么做 我尝试过 但如果在文本文件中我有 姓名 Penny Marie 它会给我 姓名 Penny 我怎样才能在s1中获得Penny Marie 谢谢 include
  • 如何比较两个字符串在每个索引处的字符?

    我有两个长度相同的字符串 我想按元素比较字符串并为每个索引返回 TRUE 或 FALSE 例如 string1 lt abcd1234 string2 lt abcd1434 result lt T T T T T F T T 到目前为止
  • org.postgresql.util.PGobject 无法转换为 org.postgis.PGgeometry

    当我尝试从 PostGIS 数据库加载点时 我得到以下信息 例外 Caused by java lang ClassCastException org postgresql util PGobject at org hibernatespa
  • Chrome 浏览器操作弹出窗口是否有硬编码的最大高度?

    我无法使 Chrome 扩展程序的 browseraction 弹出窗口高度超过 600 像素 我通过 document body style height 控制它 这是硬编码的最大值吗 我正在 OS X Lion 上使用 Chrome v
  • 如何将数组传递给需要 var args 的 objc 方法(例如...')

    我在库中有一个方法 如下所示 id initWithSomeObjects NSString something NS REQUIRES NIL TERMINATION 我真的很想用数组而不是 var args 来调用它 因为我想传入的对象