【发布时间】:2011-02-24 13:45:07
【问题描述】:
Objective-C 中BOOL 变量的默认值是多少?
【问题讨论】:
标签: objective-c initialization boolean
Objective-C 中BOOL 变量的默认值是多少?
【问题讨论】:
标签: objective-c initialization boolean
如果写有没有默认值
-(void)somemethod {
BOOL x; // <--- no default value
它被初始化为垃圾。
但是,对于BOOLivar,它将被初始化为NO,因为整个实例在初始化时被填充为 0。
(注意:启用ARC后,本地对象指针将始终具有默认值nil,但非对象类型(如BOOL)的局部变量仍被初始化为垃圾。见@ 987654321@.)
【讨论】:
NO,如上所述。我想你的意思是 var。
我自己使用 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。谢谢,祝你好运!
【讨论】: