繁体   English   中英

在iOS 8.1.1中,typecast BOOL始终返回false

[英]typecast BOOL always returns false in iOS 8.1.1

我使用以下方法将BOOL值保存并检索到字典中。

[userData setObject:@YES forKey:@"IS_AGENT"];

(BOOL) [userData objectForKey:@"IS_AGENT"];

在上面的代码中,当重试字典中的bool值时,在以下具有iOS 8.1.1的设备iPhone5s,iPhone5c,iPhone6,iPhone6 +上,我总是会出错,而在具有相同iOS 8.1.1的iPod Touch中,相同的代码也可以正常工作

谷歌搜索后,我知道我们不应该这样输入强制转换BOOL因为“ BOOL是一个char ,它是8位。如果您尝试通过BOOL压缩一个大于char的值,编译器会很高兴地截断高位,切掉它们。”

现在,我解决了仅将boolValue消息发送到特定对象的问题。 检查下面的工作代码。

[[userData objectForKey:@"IS_AGENT"] boolValue];

好的,我的问题是:“为什么仅在特定设备(iPhone5s,iPhone5c,iPhone5,iPhone6 +)上而不是在具有相同iOS 8.1.1的iPod touch中发生这种情况?”

这是我的猜测,iOS 8.1.1之前发生了什么。 也许Apple改变了这里标记的指针的工作方式,但我还没有机会对其进行测试,也没有找到关于Apple是否在此系统中进行了某些更改的参考。

您正在将指针投射到BOOL。 由于我们在这里讨论的是小端字节系统,因此将像0x12345678这样的指针强制转换为char产生0x78,当强制转换为BOOL ,由于字节不为0,因此会得到1。在具有64位二进制文​​件的64位iOS系统上,运行时使用标记的指针

对于带标记的指针,第一个字节(这是最低有效位,我们是小尾数)将始终设置最后一位,以将其标记为带标记的指针。 如果将该字节强制转换为BOOL,您将始终获得1 / YES。

但是对于未标记的指针,由于对齐,最后四位始终为0。并且偶然地,它的其他位也为0(在我的测试中,我仅看到0x20的倍数,因此每8位对象将具有0x00)。 当您将其转换为BOOL时,大多数情况下会得到YES,有时会得到NO。

如您[userData[@"IS_AGENT"] boolValue]如果您的部署目标是iOS> = 6,则查询值的正确方法是[[userData objectForKey:@"IS_AGENT"] boolValue]或简单地[userData[@"IS_AGENT"] boolValue]

首先,您使用的是KVC方法setValue:forKey:valueForKey:
这是一个严重的错误。

您需要使用setObject:forKey:objectForKey:NSMutableDictionary写入/读取对象。
另外,您正在将NSNumber强制转换为BOOL ,这将产生意外行为。

代替该代码,使用

    [userData setObject:@YES forKey:@"IS_AGENT"];
    BOOL isAgent = [[userData objectForKey:@"IS_AGENT"] boolValue];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM