2017-10-09 1 views
0

Si j'ai une méthode comme ci-dessous:Méthode d'archivage explicite retournant si l'objet est nul?

-(BOOL)shouldResize { 
    return _view != nil; 
} 

où _view est un pointeur vers un objet, est explicite nul contrôle nécessaire/recommandé, ou est-il suffisant pour simplement faire:

-(BOOL)shouldResize { 
    return _view; 
} 

Je me demande si un comportement étrange peut apparaître dans la coulée du pointeur vers une BOOL, comme dans l'exemple ici: (je suppose que vous pouvez aussi faire return !!_view, à droite) https://developer.apple.com/documentation/objectivec/bool?language=objc

+0

FYI - Votre deuxième jeu de code est la raison pour laquelle vous ne devez jamais comparer directement une variable 'BOOL' avec' NO' ou 'YES'. Faites simplement 'if (someBool)' ou 'if' (! SomeBool)'. Utiliser 'if (someBool == YES)' ou 'if (someBool == NO)' ou similaire avec '! =' Peut échouer dans un bogue difficile à trouver. – rmaddy

+0

Intéressant, merci pour le pourboire! Semble un peu cassé bien qu'un bug comme celui-là devrait se produire en premier lieu. – dobse

+0

Quel bug? Le problème est seulement lorsque vous traitez BOOL comme zéro et non nul. "BOOL" ne devrait jamais être "NON" et "OUI", pas zéro et non nul. Le seul bug ici est votre 2ème exemple de code où vous essayez de traiter un pointeur d'objet comme un 'BOOL'. – rmaddy

Répondre

1

Selon la plate-forme ou l'architecture, BOOL peut être équivalent à signed char. Par conséquent, return _view n'est pas sûr. La valeur réelle du pointeur _view sera tronquée en un seul octet. Cet octet est susceptible d'être 0 même si _view n'est pas nil. Dans ce cas, le code retournera false quand il devrait être vrai.

return _view != nil est sûr et raisonnable. L'utilisation de return !!_view est correcte et peut ne pas convenir selon les normes de codage de votre équipe. Dans certains endroits, c'est la façon idiomatique de «normaliser» une expression booléenne. D'autres peuvent le trouver trop malin par moitié et «laid» (comme exprimé dans d'autres réponses ici).

+0

+1 pour le pair juste le premier paragraphe seul - retournant '_view' lui-même tronque tout sauf le dernier octet, qui peut évaluer à 0. C'est un bogue très subtil qui est assez rare pour" fonctionner "dans la plupart des cas mais échouer apparemment au hasard. –

+0

Merci! Appréciez l'impartialité dans votre réponse (: Juste pour clarifier si j'ai fait quelque chose comme le retour 4294967040 (ff ff ff 00), cela serait faux? – dobse

-1

Il suffit de retourner la vue pour gérer automatiquement si la vue est nulle ou non. Si elle est nulle, elle retournera "NON" et "OUI" sinon. La seconde version de la méthode "shouldResize" suffit.

Selon moi, la meilleure pratique est d'avoir un contrôle nul explicite afin d'avoir une compréhension claire, une meilleure maintenabilité et éviter la surprise.

+0

Le retour de la vue ne produira pas nécessairement une valeur vraie lorsque la vue n'est pas "nulle". Voir ma réponse pour la raison pourquoi. –

+0

Le 1er paragraphe de cette réponse est faux. Il n'y aura pas de conversion automatique du pointeur d'objet aux valeurs 'NO' ou' YES'. Il se trouve que les valeurs 'NO' et' nil' sont en fin de compte les deux formes de '0' mais c'est loin d'être une conversion automatique. – rmaddy

0

Je préfère "return _view! = Nil" pour la lisibilité. La méthode retourne un booléen et donc je préfère que cela soit évident à partir du code dans la méthode.

Dans votre cas, la deuxième option (return _view) fonctionnera également.

"retour! _view" Je trouve moche.

0

Le type BOOL est défini différemment dans les modes 32 bits et 64 bits, donc le comportement est différent. Par conséquent retourner _view au lieu de _view! = Nil est un bug. Prenez un indice de Swift (que vous aurez à faire de toute façon bientôt). Dans Swift, self.view! = Nil serait le seul moyen légal. Dieu merci. A titre d'exemple, à quel point être intelligent peut être dangereux, "return! _view" n'est pas seulement laid, c'est faux. Il fait le contraire de ce qui a été demandé.

+0

La question ne proposait pas d'utiliser 'return! _view' mais' return !! _ view'. Ce n'est pas faux. Laid est dans l'oeil du spectateur. En outre, la question concerne Objective-C et Swift n'est pas pertinente. –