Objective-CのBOOL
変数のデフォルト値は何ですか?
noデフォルト値があります
-(void)somemethod {
BOOL x; // <--- no default value
ガベージに初期化されます。
ただし、BOOL
ivarの場合、インスタンス全体が0で埋められるため、NO
に初期化されます。初期化時に。
(注:ARCが有効な場合、ローカルオブジェクトポインターは常にデフォルト値nil
を持ちますが、ローカル変数は非オブジェクトBOOLのような型は依然としてガーベッジに初期化されます。 nilに設定されたローカル変数(Objective-C) を参照してください。
Xcode 5.1、OS X Mavericks 10.9.4を使用して、独自の実験を行いました。 ALogがわからない場合は、NSLogを修正します。とにかく、最初の実験では、isLandscape
をパブリック変数として使用し、@synthesize
を使用して、親View Controller(下に表示)からアクセスしました。 2番目の実験では@synthesize
を使用しませんでした。明らかに、コンソールで同じ結果を得るためにself.isLandscape
を使用しました。コンソール出力は私のコードの下にあります。 3番目の実験では、メソッド内のローカル変数として「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);
}
これらの結果は、最初の2つの実験からのものです…
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);
}
これらの結果は、3番目の実験からのものです…
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ですか?頼りにならないのは(ランダムな)ゴミ値だと思います。これが次の人に役立つことを願っています。私は何かを学びましたが、コメントを楽しみにしています。ありがとう、そして幸運を!