BOOL的默认值


Answers:


175

如果您写,则没有默认值

-(void)somemethod {
  BOOL x;  // <--- no default value

它被初始化为垃圾。

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

(注意:启用ARC时,本地对象指针将始终具有默认值nil,但是非对象类型(如BOOL)的本地变量仍会初始化为垃圾。请参阅将本地变量设置为nil?(Objective-C)。)


1
您能指望非ivar BOOL总是一样的垃圾吗?还是不同?(即,我在NSlog语句中看到它的值为'2'的整数值)
bentford 2010年

8
@本特福德:不,你不能。
kennytm 2010年

1
似乎微不足道,但要知道非常重要!谢谢!!
万亿

1
@KennyTM“非对象类型(如启用ARC的BOOL仍将初始化为垃圾”)。你确定吗?您提供的链接显示“分配对象时,Objective-C对象的实例变量始终设置为0(或nil)”,我找不到任何其他更清晰的引用,因此与我有点矛盾。
克里斯托弗·范·兰德肖特

1
在我的情况下,BOOL局部变量设置为0,即为NO。但是在发布模式下构建时,它将为YES。
ngn999 '16

24

我使用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自动初始化的,但是局部变量根本没有任何值。即便如此,请查看[Line 164]局部变量不是YES还是NO,但不是null?我猜这是您不能指望的(随机)垃圾值。我希望这对下一个人有帮助。我学到了一些东西,但我希望发表评论。谢谢,祝你好运!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.