web-dev-qa-db-fra.com

Valeur par défaut de BOOL

Quelle est la valeur par défaut d'une variable BOOL dans Objective-C?

91
suse

Il n'y a aucune valeur par défaut si vous écrivez

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

Il est initialisé en ordures.

Cependant, pour un ivar BOOL, il sera initialisé à NO, car l'instance entière est remplie de 0 à l'initialisation.

(Remarque: lorsque ARC est activé, les pointeurs d'objet locaux auront toujours une valeur par défaut nil, mais les variables locales de non-objet les types tels que BOOL sont toujours initialisés en garbage. Voir Variables locales définies sur nil? (Objective-C) .)

172
kennytm

J'ai fait mes propres expériences en utilisant Xcode 5.1, OS X Mavericks 10.9.4. Pour ceux qui ne connaissent pas ALog est un NSLog modifié. Quoi qu'il en soit, la première expérience a été d'utiliser isLandscape comme variable publique, avec @synthesize, accessible par le contrôleur de vue parent (affiché ci-dessous). La deuxième expérience n'a pas utilisé @synthesize et j'ai évidemment utilisé self.isLandscape pour obtenir le même résultat dans la console. La sortie de la console est en dessous de mon code. La troisième expérience a utilisé ‘isLandscape’ comme variable locale dans une méthode.

@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);
}

Ces résultats sont issus des deux premières expériences…

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

Dans la TROISIÈME EXPÉRIENCE, "isLandscape" n’était plus une propriété. Je l'ai défini comme une variable locale avec des résultats intéressants:

- (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);
}

Ces résultats sont issus de la troisième expérience…

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

Je suppose que les propriétés sont initialisées par moi ou Xcode automatiquement, mais les variables locales ne reçoivent aucune valeur. Même ainsi, regardez la variable locale [Ligne 164] n'est pas OUI ou NON mais elle est non nulle? Je suppose que c'est la valeur de déchets (aléatoire) sur laquelle vous ne pouvez pas compter. J'espère que cela aide la prochaine personne. J'ai appris quelque chose mais j'ai hâte de recevoir des commentaires. Merci et bonne chance!

24
Murat Zazi