ios – 将NSUInteger分配给BOOL概念性理解

ios – 将NSUInteger分配给BOOL概念性理解,第1张

概述我试图寻找BOOL概念的一个很好的答案.据我所知,零是假值,非零是真值.想到这一点,我将字符串长度分配给BOOL变量.现在,这适用于iOS> 6.在iOS 6上,我看到了奇怪的结果.对于具有奇数长度的字符串,isEnabled是turing True但是对于具有偶数长度的字符串,isEnabled是turing False. BOOL isEnabled = myString.length; 请帮 我试图寻找BOol概念的一个很好的答案.据我所知,零是假值,非零是真值.想到这一点,我将字符串长度分配给BOol变量.现在,这适用于iOS> 6.在iOS 6上,我看到了奇怪的结果.对于具有奇数长度的字符串,isEnabled是turing True但是对于具有偶数长度的字符串,isEnabled是turing False.

BOol isEnabled = myString.length;

请帮我理解这个.当然,现在我一直在为BOol变量分配表达式,如下所示:

BOol isEnabled = myString.length > 0;

确切的代码:

- (voID)textVIEwDIDChange:(UITextVIEw *)iTextVIEw {    self.navigationItem.rightbarbuttonItem.enabled = [[self.noteTextVIEw.text trim] length];}

PS:如上所述,myString的长度正在变化;从’a’到’ab’到’abc’等

解决方法

However,I Could not understand the iOS 6 behavIoUr for enabling the button for odd ones only. […] I was curIoUs to kNow the root cause.

为了解释观察到的行为,有两个技术细节需要解释:Objective-C的BOol类型和UIKit的实现细节.

BOol的类型

不同的行为实际上与iOS版本无关,而与设备的架构无关. iOS SDK如何为32位与64位架构定义BOol有所不同.请参阅objc.h中的摘录:

#if !defined(OBJC_HIDE_64) && TARGET_OS_IPHONE && __LP64__typedef bool BOol;#elsetypedef signed char BOol; #endif

因此,32位上的BOol可以具有0到255之间的任何值,而在64位上,编译器强制执行仅具有值0或1.您可以通过在模拟器上运行以下行来轻松尝试此 *** 作,设置为iPhone 4s( 32位)或iPhone 6(64位).

NSLog(@"%d",(BOol)2);

这就解释了为什么您在不同设备上看到不同的行为.但奇怪的事情从何而来呢?

UIbarbuttonItem的实现细节

还有另一个微妙的技术细节.您实际上是在设置UIbarbuttonItem的enabled属性.

Apple喜欢使用节省空间的方案在其UI组件中存储标志. BOol(在32位和64位架构上)总是使用至少一个字节,但只需要一位信息.所以他们使用bit fields存储实际值.

摘自iOS SDK 8.4 UIbarbuttonItem.h(为清晰起见缩写):

@interface UIbarbuttonItem : UIbarItem {    struct {        unsigned int enabled:1;    } _barbuttonItemFlags;}

神奇的是:_barbuttonItemFlags结构中的启用字段后面的1.这定义了宽度为1的位域.要将enabled属性与此位字段连接,它们必须实现自定义访问器.这是setter的一个例子:

- (voID)setEnabled:(BOol)enabled {    _barbuttonItemFlags.enabled = enabled;}

那么当我们这样做时会发生什么:

somebarbuttonItem.enabled = 2;

编译器理解它必须使用参数2调用setEnabled:方法.

在64位体系结构上,2将转换为_Bool,其中标准表示这必须导致值为1.在32位系统上,情况并非如此,在调用方法之前保留原始值2.

在setEnabled中:将值赋给宽度为1的无符号整数.C标准表示当分配宽度更大的无符号整数时,剩余的位只是被删除.结果是setEnabled:只存储_barbuttonItemFlags.enabled中参数的最低位.最低位是奇数上的一个,偶数上是零.

结论

所有上述行为都在标准提供的语义范围内.没有涉及未定义的行为.这是一个不幸的事实,BOol的预期行为与您在32位架构上实际获得的行为不同.

总结

以上是内存溢出为你收集整理的ios – 将NSUInteger分配给BOOL概念性理解全部内容,希望文章能够帮你解决ios – 将NSUInteger分配给BOOL概念性理解所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1046609.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存