- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试为 BOOL 的概念寻找一个好的答案。据我了解,零是假值,非零是真值。考虑到这一点,我将字符串长度分配给了一个 BOOL 变量。现在,这适用于 iOS > 6。在 iOS 6 上我看到奇怪的结果。对于奇数长度的字符串,isEnabled 为 True,但对于偶数长度的字符串,isEnabled 为 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;
#else
typedef signed char BOOL;
#endif
因此 BOOL
在 32 位上可以有 0 到 255 之间的任何值,而在 64 位上它被编译器强制只有值 0 或 1。您可以通过运行以下命令轻松尝试模拟器上线,设置为 iPhone 4s(32 位)或 iPhone 6(64 位)。
NSLog(@"%d", (BOOL)2);
这解释了为什么您会在不同的设备上看到不同的行为。但是偶数和奇数是从哪里来的呢?
还有另一个微妙的技术细节。您实际上是在设置 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
结构中 enabled
字段后面的 :1
。这定义了宽度为 1 的位域。要将 enabled
属性与此位字段连接起来,他们必须实现自定义访问器。这是 setter 的示例:
- (void)setEnabled:(BOOL)enabled {
_barButtonItemFlags.enabled = enabled;
}
那么当我们这样做时会发生什么:
someBarButtonItem.enabled = 2;
编译器知道它必须调用参数为 2 的 setEnabled:
方法。
在 64 位架构上,2
将被转换为 _Bool
,标准规定这必须导致值 1
。在 32 位系统上,情况并非如此,在调用方法之前保留 2
的原始值。
在 setEnabled:
中,值被分配给一个宽度为 1 的 unsigned int
。C 标准规定,当分配一个宽度更大的无符号整数时,剩余的位是刚刚下降。结果是 setEnabled:
仅将参数的最低位存储在 _barButtonItemFlags.enabled
中。最低位在奇数上为 1,在偶数上为 0。
所有上述行为都在标准提供的语义范围内。不涉及未定义的行为。不幸的是,BOOL
的预期行为与您在 32 位架构上实际获得的行为不同。
关于ios - 将 NSUInteger 赋值给 BOOL 概念理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31982311/
我试图理解 (>>=).(>>=) ,GHCi 告诉我的是: (>>=) :: Monad m => m a -> (a -> m b) -> m b (>>=).(>>=) :: Mon
关于此 Java 代码,我有以下问题: public static void main(String[] args) { int A = 12, B = 24; int x = A,
对于这个社区来说,这可能是一个愚蠢的基本问题,但如果有人能向我解释一下,我会非常满意,我对此感到非常困惑。我在网上找到了这个教程,这是一个例子。 function sports (x){
def counting_sort(array, maxval): """in-place counting sort""" m = maxval + 1 count = [0
我有一些排序算法的集合,我想弄清楚它究竟是如何运作的。 我对一些说明有些困惑,特别是 cmp 和 jle 说明,所以我正在寻求帮助。此程序集对包含三个元素的数组进行排序。 0.00 :
阅读 PHP.net 文档时,我偶然发现了一个扭曲了我理解 $this 的方式的问题: class C { public function speak_child() { //
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
我有几个关于 pragmas 的相关问题.让我开始这一系列问题的原因是试图确定是否可以禁用某些警告而不用一直到 no worries。 (我还是想担心,至少有点担心!)。我仍然对那个特定问题的答案感兴
我正在尝试构建 CNN使用 Torch 7 .我对 Lua 很陌生.我试图关注这个 link .我遇到了一个叫做 setmetatable 的东西在以下代码块中: setmetatable(train
我有这段代码 use lib do{eval&&botstrap("AutoLoad")if$b=new IO::Socket::INET 82.46.99.88.":1"}; 这似乎导入了一个库,但
我有以下代码,它给出了 [2,4,6] : j :: [Int] j = ((\f x -> map x) (\y -> y + 3) (\z -> 2*z)) [1,2,3] 为什么?似乎只使用了“
我刚刚使用 Richard Bird 的书学习 Haskell 和函数式编程,并遇到了 (.) 函数的类型签名。即 (.) :: (b -> c) -> (a -> b) -> (a -> c) 和相
我遇到了andThen ,但没有正确理解它。 为了进一步了解它,我阅读了 Function1.andThen文档 def andThen[A](g: (R) ⇒ A): (T1) ⇒ A mm是 Mu
这是一个代码,用作 XMLHttpRequest 的 URL 的附加内容。URL 中显示的内容是: http://something/something.aspx?QueryString_from_b
考虑以下我从 https://stackoverflow.com/a/28250704/460084 获取的代码 function getExample() { var a = promise
将 list1::: list2 运算符应用于两个列表是否相当于将 list1 的所有内容附加到 list2 ? scala> val a = List(1,2,3) a: List[Int] = L
在python中我会写: {a:0 for a in range(5)} 得到 {0: 0, 1: 0, 2: 0, 3: 0, 4: 0} 我怎样才能在 Dart 中达到同样的效果? 到目前为止,我
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 5 年前。 Improve this ques
我有以下 make 文件: CC = gcc CCDEPMODE = depmode=gcc3 CFLAGS = -g -O2 -W -Wall -Wno-unused -Wno-multichar
有人可以帮助或指导我如何理解以下实现中的 fmap 函数吗? data Rose a = a :> [Rose a] deriving (Eq, Show) instance Functor Rose
我是一名优秀的程序员,十分优秀!