Відповіді:
Там немає ні значення по замовчуванням , якщо ви пишете
-(void)somemethod {
BOOL x; // <--- no default value
Він ініціалізується до сміття.
Однак для BOOL
ivar він буде ініціалізований NO
, оскільки весь екземпляр заповнюється 0 при ініціалізації.
(Примітка: Коли ARC увімкнено, локальні вказівники на об’єкти завжди матимуть значення за замовчуванням nil
, але локальні змінні не об’єктних типів, як BOOL, все ще ініціалізуються до сміття. Див. Локальні змінні, встановлені на нуль? (Objective-C) .)
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 автоматично, але локальні змінні взагалі не отримують значень. Незважаючи на це, подивіться на місцеву змінну [Рядок 164] - це не ТАК чи НІ, але вона не дорівнює нулю? Я думаю, що це (випадкове) значення сміття, на яке ви не можете розраховувати. Сподіваюся, це допоможе наступній людині. Я чомусь навчився, але з нетерпінням чекаю коментарів. Дякую та удачі!