2014-11-07 108 views
4

我正在做一些代码重构,我遇到了一些我以前没见过的ivars语法。代码看起来像冒号如何与ivars一起使用?

@interface Object : NSObject { 
@private BOOL aBool:1; 
} 
@end 

我的问题是,什么是:1吗?

+0

从未见过。有兴趣知道。 – uchuugaka 2014-11-07 01:25:36

回答

6

此语法与ivar中的结构在结构中具有相同的含义;你正在声明一个指定大小的位域。

在这种情况下,这可能对类的实际大小没有任何影响 - 我不认为您可以分配小于一个字节 - 但编译器会警告您,如果您尝试将值转换成对于您指示的位域大小而言太大的变量:

@interface BittyBoop : NSObject 
{ 
    unsigned char bit:1; 
    unsigned char bits:4; 
} 

@end 

@implementation BittyBoop 

- (void)doThatThingIDo 
{ 
    bit = 2; // Implicit truncation from 'int' to bitfield changes value from 2 to 0 
    bits = 2; // no warning 
} 

@end 
+0

因此,对于BOOL的情况,它有NO或YES(0或1),所有这些:1什么都不做? – Gil 2014-11-08 02:42:10

+0

不是什么都没有,因为通常你可以处理一个'BOOL'的所有8位(这是一个typedef'd'unsigned char')。这可能是为了避免['BOOL'的尖角]“(http://www.bignerdranch.com/blog/bools-sharp-corners/)。 – 2014-11-08 09:07:12