BOOL的默认值
Objective-C中BOOL
variables的默认值是多less?
如果你写, 没有默认值
-(void)somemethod { BOOL x; // <--- no default value
它被初始化为垃圾。
但是,对于BOOL
ivar ,它将被初始化为NO
,因为整个实例在初始化时被填充为0。
(注意:当启用ARC时,局部对象指针总是有一个默认值nil
,但像BOOL这样的非对象types的局部variables仍然被初始化为垃圾(参见局部variables设置为nil(Objective-C)) 。
我使用Xcode 5.1,OS X Mavericks 10.9.4做了一些自己的实验。 对于那些不知道ALog的人来说是修改后的NSLog。 无论如何,第一个实验是使用isLandscape
作为一个公共variables,用@synthesize
,由父视图控制器访问(如下所示)。 第二个实验没有使用@synthesize
,我显然使用self.isLandscape
在控制台中得到相同的结果。 控制台输出在我的代码下面。 第三个实验使用“isLandscape”作为方法内的局部variables。
@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不再是一个财产。 我把它设置为一个有趣的结果的局部variables:
- (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自动初始化,但局部variables根本没有得到任何值。 即使如此,看看[行164]局部variables不是YES或NO,但它是非零? 我想这是(随机)垃圾值,你不能指望。 我希望这有助于下一个人。 我学到了一些东西,但我期待着评论。 谢谢,祝你好运!