BOOL的默认值

时间:2010-05-27 09:02:38

标签: objective-c initialization boolean

Objective-C中BOOL变量的默认值是什么?

2 个答案:

答案 0 :(得分:171)

如果您编写

,则默认值
-(void)somemethod {
  BOOL x;  // <--- no default value

它被初始化为垃圾。

但是,对于BOOL ivar ,它将初始化为NO,因为整个实例在初始化时填充为0。

(注意:启用ARC时,本地对象指针将始终具有默认值nil,但非对象类型(如BOOL)的局部变量仍会初始化为垃圾。见Local variables set to nil? (Objective-C)。)

答案 1 :(得分:23)

我使用Xcode 5.1,OS X Mavericks 10.9.4进行了一些我自己的实验。对于那些不知道ALog是修改过的NSLog的人。无论如何,第一个实验是使用isLandscape作为公共变量,@synthesize,由父视图控制器访问(如下所示)。第二个实验没有使用@synthesize,显然,我使用self.isLandscape在控制台中获得相同的结果。控制台输出低于我的代码。第三个实验使用'isLandscape'作为方法内的局部变量。

@interface MyClass : UIView // (subclass used in my UIViewController)
…
@property (nonatomic) BOOL isLandscape;  // < - - - testing this BOOL
…

@implementation MyClass
…
@synthesize isLandscape;

- (void)awakeFromNib
{
    [super awakeFromNib];
    // Test for YES or NO
    if (isLandscape == YES) {
        ALog(@"isLandscape == YES");
    } else if (isLandscape == NO) {
        ALog(@"isLandscape == NO");
    } else {
        ALog(@"isLandscape != YES/NO");
    }
    // Test for nil or non-nil
    if (isLandscape) {
        ALog(@"isLandscape");
    } else if (!isLandscape) {
        ALog(@"!isLandscape");
    } else {
        ALog(@"!= nil/non-nil");
    }
    // Test its value
    ALog(@"isLandscape == %d", isLandscape);
}

这些结果来自前两个实验......

2014-08-28 08:18:52.909 MyApp[493:60b] -[MyClass awakeFromNib] [Line 157] isLandscape == NO
2014-08-28 08:18:52.911 MyApp[493:60b] -[MyClass awakeFromNib] [Line 166] !isLandscape
2014-08-28 08:18:52.912 MyApp[493:60b] -[MyClass awakeFromNib] [Line 172] isLandscape == 0

在第三次实验中,'isLandscape'不再是属性。我将它设置为具有有趣结果的局部变量:

- (void)awakeFromNib
{
    [super awakeFromNib];
    BOOL isLandscape; // < - - - testing this BOOL
    // Test for YES or NO
    if (isLandscape == YES) {
        ALog(@"isLandscape == YES");
    } else if (isLandscape == NO) {
        ALog(@"isLandscape == NO");
    } else {
        ALog(@"isLandscape != YES/NO");
    }
    // Test for nil or non-nil
    if (isLandscape) {
        ALog(@"isLandscape");
    } else if (!isLandscape) {
        ALog(@"!isLandscape");
    } else {
        ALog(@"!= nil/non-nil");
    }
    // Test its value
    ALog(@"isLandscape == %d", isLandscape);
}

这些结果来自第三次实验......

2014-08-28 08:28:33.483 MyApp[581:60b] -[MyClass awakeFromNib] [Line 159] isLandscape != YES/NO
2014-08-28 08:28:33.486 MyApp[581:60b] -[MyClass awakeFromNib] [Line 164] isLandscape
2014-08-28 08:28:33.487 MyApp[581:60b] -[MyClass awakeFromNib] [Line 172] isLandscape == -24

我猜测属性会被我或Xcode自动初始化,但局部变量根本没有得到任何值。即便如此,看看[第164行]局部变量不是YES或NO但是它是非零的?我想这是你不能指望的(随机)垃圾值。我希望这有助于下一个人。我学到了一些东西,但我很期待发表评论。谢谢,祝你好运!