0

大多数苹果的实现,我可以看到他们使用结构来存储标志位,为什么他们这样做?为什么我们不能使用 BOOL 来处理这个呢?

从 tableview 查看下面的 Apple 示例代码,

    struct {
           unsigned int delegateheightForHeaderInSection:1;
           unsigned int dataSourceCellForRow:1;
           unsigned int delegateHeightForRow:1;
           unsigned int style:1;
           } _tableFlags;

在内部,他们可能正在使用与此类似的东西,

  _tableFlags.delegateheightForHeaderInSection = [delegate respondsToSelector:@selector(tableView:heightForHeaderInSection:)];

到处使用“_tableFlags.delegateheightForHeaderInSection”来检查用户是否实现了这个委托方法。

因此,我们不能像下面这样实现,而不是让结构来存储标志。

 BOOL delegateheightForHeaderInSection;

像这样使用它,

 delegateheightForHeaderInSection = [delegate respondsToSelector:@selector(tableView:heightForHeaderInSection:)];

这两种方法有什么区别?

4

1 回答 1

1
unsigned int delegateheightForHeaderInSection:1;

在结构中定义长度为 1 的位字段(参见例如http://en.wikipedia.org/wiki/Bit_field)。位域可用于节省空间。所以在这种情况下,四个成员delegateheightForHeaderInSection...style存储在一个整数的连续位中。

请注意,在这种特殊情况下不会节省空间。的大小_tableFlags是 的大小unsigned int,即 4。四个BOOL(又名unsigned char)成员的大小也是 4。

但是例如,长度为 1 的 32 位字段也占用 4 个字节,而 32 个BOOL成员将占用 32 个字节。

于 2013-05-08T07:04:46.053 回答