你可以用带有位域的C结构创建一个NSValue吗?

Mar*_*Thé 4 c cocoa objective-c objective-c-runtime bit-fields

我正在尝试执行以下操作,但是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
Run Code Online (Sandbox Code Playgroud)

Eli*_*gem 6

首先,哗众取宠使得他的评论说得很好:为什么使用位字段说明符(主要应用于打扰要么做微优化或手动在您需要的时候添加填充位),到随后的一个实例包装了这一切的NSValue).
这就像买一座城堡,然后住在厨房里,没有把地毯弄得干净......

我不认为是这样,通过苹果dev-docs的快速尝试得出了这个 ...当涉及到位字段时确实需要考虑几个问题.

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

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

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