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)
首先,哗众取宠使得他的评论说得很好:为什么使用位字段说明符(主要应用于打扰要么做微优化或手动在您需要的时候添加填充位),到随后的一个实例包装了这一切的NSValue).
这就像买一座城堡,然后住在厨房里,没有把地毯弄得干净......
我不认为是这样,通过苹果dev-docs的快速尝试得出了这个 ...当涉及到位字段时确实需要考虑几个问题.
我也刚刚发现了这个,这就解释了为什么位字段+ NSValue并没有真正发挥得很好.
特别是在sizeofa结构可以导致NSValue读取数据的情况下......我们应该说不稳定的方式:
你创建的结构被填充到8位.现在这些位可以读作2 int,或1 long或者其他东西......从我在链接页面上看到的内容来看,这不可能是正在发生的事情.
因此,基本上,NSValue当您使用位字段时,无法确定实际类型.如果存在歧义,则假设为int(大多数情况下为宽度为4),并且发生在/溢出下,并且您手上有一团糟.
由于编译器对于实际存储成员的位置仍然有一些自由,因此传递字符串化的typedef类型的东西(objCType: @encode(struct YourStruct)是不够的,因为很有可能你无法理解实际的struct本身,由于编译器优化等...
我建议你简单地删除位字段说明符,因为应该支持结构...至少,上次我尝试过,一个简单原始类型的结构工作得很好.
| 归档时间: |
|
| 查看次数: |
364 次 |
| 最近记录: |