【发布时间】:2013-07-28 22:06:16
【问题描述】:
所以,我最近开始学习 iOS 开发和 Objective-C,主要是使用斯坦福大学在 iTunes U 上的免费课程。
我最终偶然发现了位掩码,这是在 iOS API 中广泛使用但我不太熟悉的东西。我已经阅读了一些关于它的东西,现在我至少了解了它的基础知识。
在这门斯坦福课程中,我们正在开发一款纸牌配对游戏,例如“专注”游戏。卡片由按钮表示。正常状态 (UIControlStateNormal) 表示卡片的背面,而选中状态 (UIControlStateSelected) 表示卡片的正面(即其内容,一个名为 card.contents 的字符串属性,如“A♣”)。如果两张卡匹配,它们将变得无法播放,因此它们在已处于选定状态时进入禁用状态 (UIControlStateDisabled)。 See this image for reference.
在Apple documentation about Control States 中,我们可以找到定义可能状态的位掩码:
enum {
UIControlStateNormal = 0,
UIControlStateHighlighted = 1 << 0,
UIControlStateDisabled = 1 << 1,
UIControlStateSelected = 1 << 2,
UIControlStateApplication = 0x00FF0000,
UIControlStateReserved = 0xFF000000
};
在某个时候,在斯坦福教授讲课的代码中,以下代码用于将card.contents 设置为选中状态(卡片正面)以及选中和禁用状态的标题组合(匹配的卡片):
[cardButton setTitle:card.contents forState:UIControlStateSelected];
[cardButton setTitle:card.contents
forState:UIControlStateSelected|UIControlStateDisabled];
我不明白的是,为什么我们需要第一行?我认为第二个就足够了,因为它通过使用 OR 组合两个状态来设置按钮的标题,所以我解释它已经“涵盖”了卡片仅处于选定状态时的情况。
经过一些测试,我显然错了,所以我不太明白 iOS 如何处理存储在位掩码中的选项。你能帮帮我吗?
还有一点:在上面的枚举声明中,前四个常量定义为0、1 << 0、1 << 1、1 << 2,即0、1、@ 987654336@ 和 4。为什么开发者将第五个和第六个定义为0x00FF0000 和0xFF000000,而不是1 << 3 和1 << 4?
提前致谢!
【问题讨论】:
标签: ios objective-c c bit-manipulation bitmask