- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
当我有返回一些联合的方法时,我有一个与 objc_msgSend 运行时调用相关的问题。
我正在通过 libffi 调用 objc_msgSend 函数,如果我有小于 16B 的联合,一切都很好,但如果联合的大小大于 16B,我就会遇到段错误。我尝试使用 objc_msgSend_stret 函数,它通过了,但是我得到了返回联合的错误值,而且我不确定调用了哪个函数。
有谁知道 objective c 中的 union,它们在 objc runtime 中是如何处理的?
最佳答案
当您使用 objc_msgSend
时,这是一个 HUUUUGE 问题;基本上,大多数 ABI 喜欢将它们的返回值放在寄存器中(这里有勇敢和好奇的所有血腥细节:http://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/LowLevelABI/000-Introduction/introduction.html)但有些对象不能放入寄存器(这就是联合大小 <= 16 的原因为你工作正常)。您需要调用 objc_msgSend_stret
,而不是使用您希望将联合填充到的地址。
另一个很好的引用:http://www.sealiesoftware.com/blog/archive/2008/10/30/objc_explain_objc_msgSend_stret.html
解决方案:不要强制转换和调用objc_msgSend
,而是强制转换和调用objc_msgSend_stret
。
void objc_msgSend_stret(void * stretAddr, id theReceiver, SEL theSelector, ...)
所以你的类型转换将是(如 using objc_msgSend to call a Objective C function with named arguments ):
union myUnion {
int a, b;
char c;
double d;
};
// For objc_msgSend_stret
void (*objc_msgSend_stretTyped)(union myUnion* stretAddr, id self, SEL _cmd, float bar) = (void*)objc_msgSend_stret;
union myUnion u;
float pi = 4;
objc_msgSend_stretTyped(&u, obj, sel_getUID(sel), pi);
下面是我如何让 objc_msgSend_stret 工作:
#import "ViewController.h"
#import <objc/runtime.h>
#import <objc/objc.h>
@interface ViewController ()
@end
union myUnion {
int myArray[32];
int a,b,c,d;
};
void doStuff(id obj, SEL sel);
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
doStuff(self, @selector(doStuff:));
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (union myUnion) doStuff: (int)myInt {
NSLog(@"Pi equals %d", myInt);
union myUnion u;
for(int i=0; i<32; i++) {
u.myArray[i] = i*i*i*i-1;
}
return u;
}
@end
void doStuff(id obj, SEL sel) {
int pi = 4;
NSLog(@"myUnion is: %luB", sizeof(union myUnion));
NSLog(@"Sizeof(int) = %luB ... Sizeof(char) = %lub ... sizeof(double) = %luB", sizeof(int), sizeof(char), sizeof(double));
union myUnion u = ((union myUnion(*)(id, SEL, int))objc_msgSend_stret)(obj, sel, pi);
NSLog(@"Union u = {%d, %d, %d, %d}", u.myArray[30], u.myArray[29], u.myArray[28], u.myArray[27]);
}
关于objective-c - objc_msgSend 和联合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17662011/
我正在通过修改我为处理 slice 而创建的库来玩转泛型。我有一个 Difference接受 slice 并返回仅在其中一个 slice 中找到的唯一元素列表的函数。 我修改了函数以使用泛型,并且我正
Typescript 编译器 在我尝试使用联合或多个类型/接口(interface)时不断抛出错误。 My requirement 我从服务器收到一个对象作为响应,其中一个键 ('errorMessa
我需要在 SQLAlchemy 中执行 2 选择。例如: select1 = Session.query(col1, col2, col3, col4).filter(...) select2 = S
我建立了一个数据库来输入我所有的头痛和偏头痛跟踪数据。我正在提取一些查询,这些查询显示某一年中按月计算的不同头痛严重程度的计数。我有一个查询按月得到所有头痛,另一个在一定严重程度下得到头痛,最后一个在
我有三个表,一个是默认值表。 我需要做的是选择 TableA 和 TableB 的值,并从默认值的选择中回填任何缺失的值。 每个表都有一个键和值列。 数据的一个例子可能是这样的: DefaultTab
我正在尝试构建一个 单个 JSONPath 查询 ,它将测试 是否存在两个或多个路径 。 让我们考虑以下示例文档: { "firstName": "John",
我正在尝试基于对象中的嵌套属性创建联合类型。请参见下面的示例: type Foo = { abilities: { canManage: boolean } } typ
我有以下查询: SELECT result.globalId AS id, result.date, p1.playerName AS player, p2.playerName AS targe
我有两张 table 。第一个每天刷新。(该表有超过 10 列,但其中 2 列是相关的)我想根据 vid (这是一个唯一的 id )和人口进行每日统计。新的视频 ID 每天都会出现和消失。例如: 第一
这个问题已经有答案了: How to know what table a result came from when using UNION in MySQL (1 个回答) 已关闭 6 年前。 让我
我有 2 个表,一个列出人员及其与其属性的关系,另一个表列出属性(名字、姓氏等)。 人员表中的每个人可能不具有属性表中列出的所有属性。我想要的是每个人都为每个属性返回一行,无论他们是否有链接。 举个例
假设我们有 MySQL 服务器 A,我们需要在其中创建位于服务器 B 上的表的“副本”。 我们没有启用联合。重置服务器 A 会造成很多麻烦,我相信,我们不能在不重置的情况下启用联合。我也认为在B服务器
我有一个 Java 类 A。A 的构造函数调用了几个方法 m1、m2。 class A{ public A(){ m1(); m2(); ......
我正在开发一种编程语言,我想为其提供一个Range 数据类型,目前它不是通常的int 对列表。值 (x,y)约束条件是 x < y .我说不像通常那样,因为通常一个范围只是一对,但在我的例子中,它超过
我正在寻找加速一段合并两个 SortedLists 的代码。 C# 4.0 通用 SortedList:http://msdn.microsoft.com/en-us/library/ms132319
如果我有以下包含函数及其参数的联合,我该如何调用它? type Wrapper = { fn: (a: string) => void arg: string } | { fn: (a:
我正在尝试移植一个内部有一个联合的 C 结构。 Winapi.Winsock2.pas 中的默认结构记录中缺少某些字段。 但这是正确的方法吗?谢谢。 typedef struct _WSACOMPLE
我希望通过“版本”编号的前 8 个字符的子字符串对以下查询的结果进行排序。我理解 SUBSTRING(),所以不要用这个来打扰我。我的问题是尝试实际放置关于 UNION 的 ORDER BY。 更新:
我需要创建一个带有联合的 QueryBuilder,这可能吗? $qb = $this->em->createQueryBuilder() ->select('table1.numObject
我正在为 Magic the Gathering Cards 创建库存系统,需要使用主要卡片信息更新价格。 我有两个表,卡片和价格 卡片有以下列:ID、姓名、Ed、价格 价格有以下列:姓名、Ed、价格
我是一名优秀的程序员,十分优秀!