Pergunta

Estou seguindo um dos exemplos muito iniciais em Aprendizagem Objetivo-C no Mac. Meu código é quase exatamente o mesmo que o código no livro (alguns espaços e parênteses triviais podem diferir). Se parece com isso:

#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;
}

Quando eu corro o código, é isso que recebo no 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

Não sei por que isso está acontecendo. Eu sei que tem algo a ver com o boolString Função, porque quando eu comento a chamada para isso, o programa funciona bem. Meu intestino me diz que isso tem algo a ver com algumas novas coisas de gerenciamento de memória no Snow Leopard (este livro antecede o Snow Leopard por cerca de seis meses). Alguém sabe qual pode ser o problema?

Foi útil?

Solução

Você tem um erro de digitação na linha 30. Você deseja %d, não $ d. Como você está perdendo o segundo espaço reservado decimal, você passa 42 para o %@, e o NSLog tenta desreferenciar a memória 42 como se fosse o ponteiro de uma string e você trava.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top