gpt4 book ai didi

objective-c - 你能用位域从 C 结构创建 NSValue 吗?

转载 作者:太空狗 更新时间:2023-10-30 04:02:02 25 4
gpt4 key购买 nike

我正在尝试执行以下操作,但 NSValue 的创建方法返回 nil。不支持结构中的 C 位域吗?

struct MyThingType {
BOOL isActive:1;
uint count:7;
} myThing = {
.isActive = YES,
.count = 3,
};

NSValue *value = [NSValue valueWithBytes:&myThing objCType:@encode(struct MyThingType)];
// value is nil here

最佳答案

首先,claptrap 在他的评论中提出了一个非常好的观点:为什么要费心使用位域说明符(主要用于要么进行微优化或在需要的地方手动添加填充位) , 然后将其全部包装在 NSValue 的实例中)。
这就像买了一座城堡,却住在厨房里,却没有清理地毯……

我不认为是,通过 apple dev-docs 快速慢跑 came up with this ...当谈到位域时,确实有几个问题需要考虑。

我也刚找到 this ,这解释了为什么位域 + NSValue 不能很好地协同工作。
特别是在 sizeof 结构可能导致 NSValue 以...读取数据的情况下......我们应该说不稳定的方式:
您创建的结构被填充为 8 位。现在这些位可以读作 2 int,或 1 long 或其他东西......从我在链接页面上读到的内容来看,这不太可能是什么正在发生。
所以,基本上,当您使用位字段时,NSValue 无法确定实际类型。在出现歧义的情况下,假定一个 int(在大多数情况下宽度为 4)并发生下溢/溢出,并且你手头上一团糟。

由于编译器对于成员的实际存储位置仍有一些自由,因此传递字符串化类型定义之类的东西(objCType:@encode(struct YourStruct),因为由于编译器优化等原因,您很有可能无法理解实际结构本身......

我建议您简单地删除位字段说明符,因为结构应该得到支持...至少,上次我尝试时,具有简单原始类型的结构工作得很好。

关于objective-c - 你能用位域从 C 结构创建 NSValue 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21209714/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com