2012-09-24 3 views
0

J'ai une méthode simple qui vérifie la superview d'une vue, et renvoie un BOOL. Cependant, par intermittence, la méthode ne parvient pas à produire la bonne réponse (ou du moins la réponse que j'attends).UIView.superView (BOOL) == Échec

La méthode est:

-(BOOL) isTheViewShowing 
{ 
    return (BOOL) [theView superview]; 
} 

Il y a un Gesture du robinet qui élimine la vue, et je me suis connecté ce qui suit (au moment où survient indésirable):

isTheViewShowing: NO 
theView: <UIView: 0x3c1a10; frame = (0 232; 320 135); clipsToBounds = YES; layer = <CALayer: 0x365480>>, 
superView: <UIView: 0x392400; frame = (0 0; 320 367); autoresize = W+H; layer = <CALayer: 0x35fe90>> 

Comme le journal montre le Superview existe, mais pourquoi la distribution échoue?

Répondre

7

Superview: < UIView: 0x392400

Notez que l'octet de poids faible de superview est 0x00. Je n'ai pas vraiment regardé ce qui se passe quand vous essayez de lancer un pointeur vers un BOOL, mais comme un BOOL est essentiellement un char je ne serais pas du tout surpris si le compilateur regarde juste l'octet de poids faible. Essayez ceci:

-(BOOL) isTheViewShowing 
{ 
    return ([theView superview] != nil); 
} 

C'est mieux sur deux points: 1) il fonctionne réellement, et 2) mieux communiquer ce que vous essayez de faire.

+1

+1 très bonne reprise sur l'octet d'adresse de poids faible. pourrait expliquer pourquoi le problème est intermittent. – FluffulousChimp

+0

Merci Caleb, juste par curiosité, le casting d'un gros int à bool échouer dans des circonstances similaires (parce que le pointeur lui-même est juste un int, non?) – TMacGyver

+0

@TMacGyver Oui, la même chose pourrait arriver. Je n'irais pas jusqu'à assimiler un pointeur avec un int, cependant - ce sont des types différents. – Caleb