objective-c - 为什么 Apple 在其类中使用 "flags"结构体?

标签 objective-c c macos cocoa struct

我的问题是关于 Apple Objective-C header 中的样式/结构。以NSSplitViewItem为例:

NSSplitViewItem(苹果):

@interface NSSplitViewItem : NSObject  {
@private
    id _splitViewItemPrivateData;
    struct {
        unsigned int _collapsed:1;
        unsigned int _canCollapseFromDrag:1;
        unsigned int _canCollapseFromDoubleClickOnDivider:1;
        unsigned int _reserved:29;
    } _flags;
}


为什么是结构体?

为什么 Apple 似乎倾向于使用 int 标志结构作为选项?这种模式在整个标题中非常常见,甚至在看似不必要的地方(例如这里)。为什么不直接将这些整数作为 iVar 放在类中,而不是将它们包装到结构中?

是否有一些性能提升或其他好处?这里的“旗帜”都与“折叠”有关。但在其他类中,例如 NSTableView,有一些“flags”结构,其中有超过两打不相关的条目。

那么这只是苹果的风格,还是有更有意义的东西?

最佳答案

他们正在使用位字段。在这种情况下,这意味着三个值仅存储在 32 位中。另外,为了将来的扩展,他们可以在相同的 32 位中添加 29 个 bool 变量,而无需更改结构的布局。如果数据是持久的,那么添加这 29 个进一步的变量甚至不需要更改版本号。

如果您有两打不相关的值,那么这两打值仅存储在 32 位 = 4 字节中。这一切都有助于内存使用。

关于objective-c - 为什么 Apple 在其类中使用 "flags"结构体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30614611/

相关文章:

c - 如何将字符串的一部分复制到另一个字符串中?

objective-c - 为最前面的应用程序生成键盘事件

Java -Xmx1028m 在 Mac OS X 中不起作用

iphone - 在 Cocoa 中是否有更简洁的方法来连接这些字符串?

objective-c - UITabbarcontroller 内的 UINavigation Controller 意外行为

C:头文件和include问题。需要帮忙!

Cachegrind输出解释

c++ - 设置包括 mac os 中 eclipse CDT 中的路径(来自框架的 header )

ios - 数据从 JSON 解析直接到 UITableView

objective-c - NSDictionary 和关于 "pointer from integer without a cast"的警告