2009-12-19 9 views
1

Je suis un des premiers exemples de Learning Objective-C on the Mac. Mon code est presque exactement le même que le code dans le livre (quelques espaces et parenthèses triviales peuvent différer). Il ressemble à ceci:EXC_BAD_ACCESS sur un programme Objective-C très simple (Snow Leopard)

#import <Foundation/Foundation.h> 

BOOL areIntsDifferent (int thing1, int thing2) { 
    if (thing1 == thing2) { 
     return NO; 
    } 
    else { 
     return YES; 
    } 

} 

NSString * boolString (BOOL yesNo) { 
    if (yesNo == NO) { 
     return (@"NO"); 
    } 
    else { 
     return (@"YES"); 
    } 
} 


int main (int argc, const char * argv[]) { 
    BOOL areTheyDifferent; 

    areTheyDifferent = areIntsDifferent(5, 5); 
    NSLog(@"are %d and %d different? %@", 5, 5, boolString(areTheyDifferent)); 

    areTheyDifferent = areIntsDifferent(23, 42); 
    NSLog(@"are %d and $d different? %@", 23, 42, boolString(areTheyDifferent)); 

    return 0; 
} 

Quand je lance le code, ce que je reçois dans la console:

[Session started at 2009-12-19 01:41:37 -0500.] 
GNU gdb 6.3.50-20050815 (Apple version gdb-1346) (Fri Sep 18 20:40:51 UTC 2009) 
Copyright 2004 Free Software Foundation, Inc. 
GDB is free software, covered by the GNU General Public License, and you are 
welcome to change it and/or distribute copies of it under certain conditions. 
Type "show copying" to see the conditions. 
There is absolutely no warranty for GDB. Type "show warranty" for details. 
This GDB was configured as "x86_64-apple-darwin".tty /dev/ttys001 
Loading program into debugger… 
Program loaded. 
run 
[Switching to process 3125] 
Running… 
2009-12-19 01:41:38.432 BOOL Party[3125:a0f] are 5 and 5 different? NO 
Program received signal: “EXC_BAD_ACCESS”. 
sharedlibrary apply-load-rules all 

Je ne sais pas pourquoi cela se passe. Je sais que cela a quelque chose à voir avec la fonction boolString, parce que quand je commente l'appel, le programme fonctionne bien. Mon instinct me dit que cela a quelque chose à voir avec de nouveaux trucs de gestion de la mémoire dans Snow Leopard (ce livre date d'environ six mois avant Snow Leopard). Quelqu'un sait-il quel pourrait être le problème?

+0

Peu petits morceaux, Pour votre méthode isDifferent, je mettre en œuvre comme ceci: BOOL areIntsDifferent (int Thing1, int thing2) { retour (Thing1 == thing2); Au lieu de vérifier si quelque chose est le même et si vous renvoyez un booléen, il est toujours préférable de retourner la valeur du test d'égalité. Cette partie suivante est plus une suggestion, certains peuvent être en désaccord: NSString * boolString (BOOL ouiNo) { return (boolString)? @"OUI NON"; } Cet extrait ci-dessus renvoie @ "YES" si boolString est vrai (égal à YES) et @ "NO" sinon. Juste des suggestions. – micmoo

+0

return (thing1 == thing2) retournera YES si les arguments sont les mêmes, ce qui semble le contraire de ce qu'une fonction appelée areIntsDifferent() devrait faire. Je suis d'accord que la mise en œuvre n'est pas la meilleure. – kiamlaluno

+0

Cette mise en œuvre n'est certainement pas la meilleure. Je suis juste en train de suivre des exemples tirés du livre. – jakeboxer

Répondre

8

Vous avez une faute de frappe dans la ligne 30. Vous voulez% d, pas $ d. Parce que vous manquez le deuxième espace réservé décimal, vous finissez par passer 42 au% @, et NSLog essaie de déréférencer l'emplacement de mémoire 42 comme si c'est le pointeur vers une chaîne, et vous plantez.

+0

Wow, super attrape. J'ai fait assez de PHP dans mon passé que j'ai l'habitude de voir les choses préfixées par $, et c'est juste à côté du%, donc je finis par le faire assez fréquemment. Merci beaucoup. – jakeboxer