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概念性理解所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)