【问题标题】:Default value of BOOLBOOL 的默认值
【发布时间】:2011-02-24 13:45:07
【问题描述】:

Objective-C 中BOOL 变量的默认值是多少?

【问题讨论】:

    标签: objective-c initialization boolean


    【解决方案1】:

    如果写有没有默认值

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

    它被初始化为垃圾。

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

    (注意:启用ARC后,本地对象指针将始终具有默认值nil,但非对象类型(如BOOL)的局部变量仍被初始化为垃圾。见@ 987654321@.)

    【讨论】:

    • 你能指望非 ivar BOOL 总是一样的垃圾吗?还是不同? (即,我在 NSlog 语句中看到它评估为“2”的整数值)
    • @bentford ivar 被初始化为NO,如上所述。我想你的意思是 var。
    • 看似微不足道,但知道非常非常重要!谢谢!!
    • @KennyTM “启用 ARC 的 BOOL 等非对象类型仍将被初始化为垃圾”。您确定吗?您提供的链接说“分配对象时,Objective-C 对象的实例变量始终设置为 0(或 nil)”,我找不到任何其他更清晰的参考,所以这对我来说有点矛盾。跨度>
    • 在我的例子中,BOOL 局部变量设置为 0,那是 NO。但是在 Release 模式下构建时,它将是 YES。
    【解决方案2】:

    我自己使用 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 但它不是 nil?我猜这是你不能指望的(随机)垃圾值。我希望这可以帮助下一个人。我学到了一些东西,但我期待着 cmets。谢谢,祝你好运!

    【讨论】:

      猜你喜欢
      • 2014-06-29
      • 1970-01-01
      • 2015-05-24
      • 2011-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多