gpt4 book ai didi

ios - 对 UITextView、UIButton 和 BOOL 感到困惑

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:38:19 25 4
gpt4 key购买 nike

我有一个 textView 和一个按钮。 Button 的enabled 属性与textView 中的文本长度有关。我直接把NSUInteger赋值给BOOL,现在证明不合适。

- (void)textViewDidChange:(UITextView *)textView {
self.button.enabled = textView.text.length; //unsuitable on 32-bit. Should be `textView.text.length > 0`
}

32 位设备上的奇怪之处:如果我将“abc”粘贴到 textView 中,或者粘贴“ab”然后键入“c”,则该按钮始终处于禁用状态。但是,如果我将这三个字母一一键入,该按钮将按其应有的方式执行。 3种情况都达到了self.button.enabled = (BOOL)3,但是为什么button的表现不一样呢?

最佳答案

BOOL 类型

不同的行为实际上与设备的架构有关。 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);

这就是为什么您会在不同的设备上看到不同的行为。

编辑: 发布 OP 评论:

要理解这一点,您需要了解 enabled 属性是如何设置的:unsigned int enabled:1。这定义了宽度为 1 的位域。

32 位 系统上,根据 C 标准,当分配一个更大宽度的无符号整数时,剩余的位将被丢弃。所以最低位实际上是驱动按钮的启用/禁用。

关于ios - 对 UITextView、UIButton 和 BOOL 感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33209281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com