Valeur par défaut de BOOL

Réponses:

175

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

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

Il est initialisé à garbage.

Cependant, pour un BOOL ivar , il sera initialisé à NO, car toute l'instance est remplie avec 0 à l'initialisation.

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

KennyTM
la source
1
Pouvez-vous compter sur le BOOL non ivar pour toujours être la même poubelle? ou est-ce différent? (c'est-à-dire. Je le vois évaluer à la valeur entière de «2» dans une instruction NSlog)
Bentford
8
@bentford: Non, vous ne pouvez pas.
kennytm
@bentford L'ivar est initialisé NOcomme mentionné ci-dessus. Je pense que tu veux dire var.
Raffi Khatchadourian
1
semble être trivial mais très très important à savoir! Merci!!
trillions
1
@KennyTM "Les types non-objet comme BOOL avec ARC activé seront toujours initialisés à la poubelle". Êtes-vous sûr de cela? Le lien que vous fournissez dit: "Les variables d'instance des objets Objective-C sont toujours mises à 0 (ou nul) lorsque vous allouez un objet" et je ne trouve aucune autre référence plus claire, donc tout cela est un peu contradictoire pour moi.
Kristof Van Landschoot
24

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 isLandscapecomme variable publique, avec @synthesize, pour être accessible par le contrôleur de vue parent (affiché ci-dessous). Deuxième expérience n'a pas utilisé @synthesizeet moi, évidemment, utilisé self.isLandscapepour 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 proviennent 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 automatiquement par moi ou Xcode, mais les variables locales n'obtiennent 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 des déchets (aléatoire) sur laquelle vous ne pouvez pas compter. J'espère que cela aidera la prochaine personne. J'ai appris quelque chose mais j'attends avec impatience les commentaires. Merci et bonne chance!

Murat Zazi
la source