- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
假设我在运行时得到一个对象和它的选择器之一,我打算安全地调用它,所以我定义了
#define objc_msgsend_va ((void (*)(id, SEL, ...))objc_msgsend)
#define Call_object(obj, sel, ...) objc_msgsend_va(obj, sel, ## __VA_ARGS__)
我能否安全地将任何方法调用替换为 Call_object 宏,否则它可能会导致某种崩溃。
这是为了定义一个宏来在 iOS 设备上运行任意运行时方法,我无法显式转换为每个方法的正确函数类型,所以我使用了可变长度参数。
主要考虑的是这样使用宏的安全性。
最佳答案
不,这绝对不安全。它适用于许多常见情况,但 va_args 与直接将参数传递给函数不同。
请,请,请使用 NSInvocation
。 它为您解决了大约 99% 的问题,同时更加安全。可能存在它无法解决的边缘情况(例如,参数列表中的 SSE/AVX vector ),但它会比您可能一起破解的内容实现跨越式发展。
让我们按架构对其进行分解,看看它可能在哪里起作用。
这些问题将无处不在,没有真正的解决方案。
当作为 va_args 传递时, float 总是被放大为 double 值。参见 the C standard ,第 6.5.2.2 节
short
和 char
也是如此。它们也会变大,通过时会造成很大的痛苦和痛苦。从技术上讲(与 float 不同,因为它们有时会在特殊的 FPU 寄存器中传递),对于整数类型,您可以通过将它们包装在单个元素结构中来解决这个问题。这将阻止他们得到晋升。不过,请不要这样做。
union 体,或复杂的结构体。需要额外的对齐和填充以及注意事项。如果你想要一个稳定的解决方案,你将不得不深入研究编译器代码。
如果您开始接触返回值,事情会变得更加复杂,并且您需要了解架构何时将结构打包到寄存器中以获得返回值(请参阅 a lot of 之前的讨论) .
我不介意这个。如果您仍然需要定位这些 macOS 设备,请注意以下两点:
我为你感到难过。
在这方面,您可能比我了解更多的背景信息。祝你好运,万事如意。
32 位 x86 相当正常。没有复杂的寄存器参数传递,在我的脑海中,我觉得这可能是相当理智的。除了前面提到的问题之外,最大的问题是由 x87 FPU 引起的。避免漂浮,你可能不会在这里燃烧世界。
64 位 x86 完全是另一种野兽。您将必须学习很多有关编译器如何将寄存器分配给参数(和返回值!)的知识,当然还有用于浮点的新 SSE 寄存器。
我将把它们放在一起,从这个角度来看没有重大区别。
与 x86-64 一样,如果您想 100% 安全,您必须了解一些寄存器在堆栈中的位置,但如果内存恢复的话,这里的浮点传递更简单。
Apple 的 ABI guide这是你的 friend 。
这是我的知识最不稳定的地方,如果这些信息中有任何不正确的地方,我深表歉意。
大部分函数调用都是完全通过寄存器来执行的,所以我们之前所有的担心都还在。现在有新的 FPU 寄存器,您必须为您的 float 处理,但如果您已经达到这一点,就没有什么是不可逾越的了。
关于可以安全地将 objc_msgsend 转换为可变长度参数函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55841366/
在我的 java 代码中,我做了类似的事情: int sleep = 0; sleep(sleep); sleep++; 被bos指出不好。它不能在 php 中正常工作。 在 java 中使用上述代码
我有一个程序使用第 3 方库进行一些计算,我在与主应用程序不同的线程上启动该程序。不幸的是,此计算可能需要很长时间,并且不提供进度更新和取消的接口(interface)。 为了拥有这样的界面,我想创建
C++ 是否有任何等效于 python 的函数 os.path.join?基本上,我正在寻找将文件路径的两个(或多个)部分组合在一起的东西,这样您就不必担心确保这两个部分完美地结合在一起。如果它在 Q
我正试图站起来(非商业)web application使用 neo4j Community 3.5.2 作为后端。 应用程序以两种方式与图形交互: 服务器端(安全的)用 flask 编写新的节点和关系
我正在开发一个将有许多外部用户的在线应用程序。至于现在,我的连接方法是为所有用户托管一个中央数据库,而他们从自己的服务器文件连接。 方法: PHP 连接文件(托管在他们的服务器上;文件由我提供) >>
我创建了一个将所有事件通知代码转换为字符串的函数。真的很简单。 我有一堆常量,比如 const _bstr_t DIRECTSHOW_MSG_EC_ACTIVATE("A video window i
我想将(附加)信息从过滤器传递到资源。我目前尝试这样做的方式是,在 Filter 中: getContext().getAttributes().put("additionalInformation"
我想计算转换系数。为此,我必须除以例如的最大值。 ushort 为 uchar 的最大值。 我想通过将参数传递给函数或类型名来动态地执行此操作。然后我想选择最大值并执行计算。 有两个问题: 如何动态选
我希望我的用户在用 Java 请求列表时能够编写自己的过滤器。 选项 1) 我正在考虑将 JavaScript 与 Rhino 结合使用。 我将用户的过滤器作为 javascript 字符串获取。然后
(安全地)提供来自不同域的图像是否符合 PCI 标准?我搜索了 PCI DSS 2.0 PDF,但没有找到任何引用资料。 最佳答案 图像不符合 PCI 合规性。 PCI DSS covers the
我们正在将 spring 和 hibernate 用于 web 应用程序:该应用程序有一个购物车,用户可以在其中放置商品。为了保存不同登录名之间要查看的项目,购物车中的项目值存储在表中。提交购物车时,
我正在为多个客户创建一个具有电子商务元素的 Rails 应用程序 - 我希望这些客户能够在管理区域中指定计算运费的公式;因为方法可能不同。 让我们假装一下,我允许他们输入 ruby 代码,然后我稍
我正在 Eclipse 中开发一个 Java 项目,使用 Maven 构建和管理依赖项。该项目分布在 5 个 Eclipse 项目中,其中一个是父 POM。我正在研究基于另一个团队实现的更复杂服务器的
我想在 ADO.NET 数据服务中存储每线程数据。在线程特定的静态变量上使用 ThreadStatic 属性是否安全,或者我会遇到问题吗?我担心的是,我的 ThreadStatic 变量在请求完成并且
Stackoverflow 上至少有一篇与此主题相关的帖子:Generate password in python 你会发现这个主题甚至在 PEP 中也受到了一些批评。这里提到:https://www
对于我工作中的一个项目,我需要创建一个独立的 Python 安装(来自源代码)。然而,完整的目录占用大约 90MB 的磁盘空间,虽然不多,但太多了,无法一遍又一遍地复制。 我可以从自定义 python
例如,我有一张学生表,我有一本 Python 字典 mydict = {"fname" : "samwise", "lname" : "gamgee", "age" : 13} 我怎样才能安全地生成一
我经常在代码中遇到使用 memset 手动零初始化的 POD 结构,如下所示: struct foo; memset(&foo, 0, sizeof(foo)); 我检查了 C++11 标准,它说:“
我是一名优秀的程序员,十分优秀!