Aprenda Objective-C

  • Página Inicial
  • Contato!
  • Tudo sobre Objective-C Parte 1!
  • Tudo sobre Objective-C Parte 2!
  • Tudo sobre Objective-C Parte 3!
  • Tudo sobre Objective-C Parte 4!
  • Tudo sobre Objective-C Parte 1

    Primeiros Passos

    O ideal para programar em Objective-C é usar o Mac e a IDE oficial XCode, mas podemos fazer programas em outros sistemas operacionais. Para usar no Linux, basta instalar o gcc, o gobjc e o gnustep-devel no sistema.

    Os programas em Objective-C são colocados em arquivos com a extensão .m, e arquivos de cabeçalho usam .h, assim como em C e C++.

    Esse é o olá mundo em Objective-C:

    
    #import <Foundation/Foundation.h> // Importação da biblioteca Foundation, necessária pros programas básicos em Objective-C
    
    int main(int argc, const char *argv[]) { // Método principal, com parâmetros que serão recebidos via linha de comando
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // Criação do objeto de liberação automática
    
        NSLog(@"Olá, Mundo!"); // Método de saída
    
        [pool drain]; // Liberação do receptor pool, usando o método drain do objeto
    
        return 0; // Retorno do método main, 0 significa execução com sucesso
    }
    
    

    Para compilar, usamos esse comando (podemos colocar num makefile também):

    
    gcc olamundo.m -I /usr/include/GNUstep/ -L /usr/lib/GNUstep/ -l objc -lgnustep-base -fconstant-string-class=NSConstantString -lm -ldl -fobjc-exceptions -o olamundo -no-pie
    
    

    Os comentários são feitos da mesma forma que em C:

    
    // Comentário de uma linha
    
    /*
    Comentário
    de
    várias
    linhas
    */
    
    

    Variáveis

    Os tipos primitivos Básicos consistem em tipos aritméticos inteiros e de ponto-flutuante. Veja abaixo os tipos:

    Tipo Tamanho Faixa de Valores
    char 1 byte -128 a 127
    unsigned char 1 byte 0 a 255
    signed char 1 byte -128 a 127
    int 4 bytes -2147483648 a 2147483647
    unsigned int 4 bytes 0 a 4294967295
    short 2 bytes -32,768 a 32,767
    unsigned short 2 bytes 0 a 65,535
    long 4 bytes -2147483648 a 2147483647
    unsigned long 4 bytes 0 a 4294967295
    float 4 bytes 3.4E-38 a 3.4E+38 (até 6 casas decimais)
    double 8 bytes 1.7E-308 a 1.7E+308 (até 15 casas decimais)
    long double 12 bytes 3.4E-4932 a 1.1E+4932 (até 19 casas decimais)
    bool 1 byte true/false
    char[] 1 byte por caractere Textos em Geral

    PS: Letras únicas em char se coloca entre aspas simples, cadeias de caracteres se coloca entre aspas duplas.

    Uma declaração simples de variáveis seria assim:

    
    #import <Foundation/Foundation.h>
    
    int main(int argc, const char *argv[]) {
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    
        int numero = 50;
        float real = 9.85;
        char letra = 'A';
        char* frase = "Isso é uma String!";
        const bool LOGICO = true; // Constante, não pode ser alterada
    
        // Formatações tipo o printf do C:
        NSLog(@"%d", numero);
        NSLog(@"%.2f", real);
        NSLog(@"%c", letra);
        NSLog(@"%s", frase);
        NSLog(@"%s", LOGICO ? "true" : "false");
    
        [pool drain];
    
        return 0;
    }
    
    

    As máscaras de formatação são as mesmas do C, %s para ponteiro de char, %c para char único, %d para inteiros, %f para reais e %p para ponteiros. As formatações usando eles também são os mesmos (tipo %.1f).

    PS: No caso de strings, é recomendável usar a classe NSString, assim:

    
    NSString *frase = @"Isso é uma String!";
    
    NSLog(@"%@", frase);
    
    

    Para ler dados do teclado, usamos os mesmos comandos em C:

    
    int main(int argc, const char *argv[]) {
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    
        int numero;
        float real;
        char letra;
        char frase[25];
    
        // Inclua stdio.h igual se faz no C:
        printf("Digite um número inteiro: "); // O printf não pula linha
        scanf("%d", &numero);
        printf("Digite um número real: ");
        scanf("%f", &real);
        fflush(stdin); // Limpeza buffer
        printf("Digite uma única letra: ");
        scanf("\n%c", &letra); // Pra evitar erros
        fflush(stdin);
        printf("Digite uma frase: ");
        scanf("\n"); // Pra evitar erros
        fgets(frase, 25, stdin);
    
        system("clear"); // Inclua stdlib.h igual ao C
    
        NSLog(@"%d", numero);
        NSLog(@"%.2f", real);
        NSLog(@"%c", letra);
        NSLog(@"%s", frase);
    
        [pool drain];
    
        return 0;
    }
    
    

    Operadores Aritméticos

    Os operadores aritméticos em Objective-C são os mesmos do C e outras linguagens. Veja um exemplo de uso:

    
    int main(int argc, const char *argv[]) {
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    
        int n1, n2, soma, subs, mult, divi, rest;
    
        printf("Digite um número: ");
        scanf("%d", &n1);
        printf("Digite outro número: ");
        scanf("%d", &n2);
    
        soma = n1 + n2;
        subs = n1 - n2;
        mult = n1 * n2;
        divi = n1 / n2;
        rest = n1 % n2;
    
        system("clear");
    
        NSLog(@"A soma entre %d e %d é igual a %d.", n1, n2, soma);
        NSLog(@"A subtração entre %d e %d é igual a %d.", n1, n2, subs);
        NSLog(@"A multiplicação entre %d e %d é igual a %d.", n1, n2, mult);
        NSLog(@"A divisão entre %d e %d é igual a %d com resto de %d.", n1, n2, divi, rest);
    
        [pool drain];
    
        return 0;
    }
    
    

    PS: Podemos também colocar atribuição com algum valor, como por exemplo num += 2 ou num -= 3, que faça a atribuição e a operação juntos no mesmo comando. Concatenação com atribuição também pode ser colocada com o +=.

    Lembrando da ordem de precedência, que é a mesma de outras linguagens. Veja como exemplo um uso:

    
    int main(int argc, const char *argv[]) {
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    
        float nota1, nota2, media;
    
        printf("Digite a primeira nota: ");
        scanf("%f", &nota1);
        printf("Digite a segunda nota: ");
        scanf("%f", &nota2);
    
        media = (nota1 + nota2) / 2;
    
        system("clear");
    
        NSLog(@"A média das notas é de %.1f.", media);
    
        [pool drain];
    
        return 0;
    }
    
    

    Veja outro exemplo:

    
    int x, y, z, w;
    
    printf("Digite um número: ");
    scanf("%d", &x);
    printf("Digite o valor à somar: ");
    scanf("%d", &y);
        
    z = x + y;
    w = pow(x, 3); // Adicione Biblioteca math.h
    
    NSLog(@"A soma de %d com %d equivale a %d.", x, y, z);
    NSLog(@"%d elevado ao cubo: %d.", x, w);
    
    

    PS: Para funções aritméricas, como o pow(), é necessário adicionar a biblioteca math.h.Veja algumas dessas funções abaixo:

    Manipulando NSStrings

    O NSString são objetos, portanto, possuem métodos para os manipularem. Esses são os métodos mais usados:

    
    int main(int argc, const char *argv[]) {
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    
        NSString *exemplo = @"Exemplo de String!";
        const char *frase = "Isso é uma frase!";
        NSString *comEsp = @"   Frase para fazer o \"trim\"!    ";
    
        NSString *caixaAlta, *caixaBaixa, *concatenada, *subst, *novo, *extNum, *extReal, *extAlg, *semEsp;
        const char* volta;
        int tamanho;
        bool compara;
        int num, alg;
        float real;
    
        caixaAlta = [exemplo uppercaseString];
        caixaBaixa = [exemplo lowercaseString];
        concatenada = [exemplo stringByAppendingFormat: @" E mais alguma coisa!"];
        subst = [exemplo stringByReplacingOccurrencesOfString: @"String" withString: @"Frase"];
        novo = [[NSString alloc] initWithUTF8String: frase];
        volta = [exemplo UTF8String];
        tamanho = [exemplo length];
        compara = [exemplo isEqualToString: caixaAlta];
        semEsp = [comEsp stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceCharacterSet]];
    
        // Conversões:
    
        extNum = @"50";
        extReal = @"9.85";
        alg = 15;
        num = [extNum integerValue];
        real = [extReal floatValue]; // também podemos usar doubleValue para valores double
        extAlg = [NSString stringWithFormat: @"%d", alg];
    
        NSLog(@"%@", caixaAlta);
        NSLog(@"%@", caixaBaixa);
        NSLog(@"%@", concatenada);
        NSLog(@"%@", subst);
        NSLog(@"%@", novo);
        NSLog(@"%s", volta);
        NSLog(@"%d", tamanho);
        NSLog(@"%s", compara ? "igual" : "diferente");
        NSLog(@"%@", semEsp);
        NSLog(@"%d", num);
        NSLog(@"%.2f", real);
        NSLog(@"%@", extAlg);
    
        [pool drain];
    
        return 0;
    }
    
    

    Já variáveis char, são manipuladas da mesma forma que no C, como podem ver:

    
    const char* frase = "90"; // Inclua stdlib.h
    int novo = atoi(frase);
    
    NSLog(@"%d", novo);
    
    int numero = 50;
    char texto[10];
    
    sprintf(texto, "%i", numero); // Pode ser usado também pra concatenar variáveis de vários tipos
    
    NSLog(@"%s", texto);
    
    char letra = 'a'; // Inclua ctype.h
    char maiuscula = toupper(letra); // Pra minúscula use tolower
    
    NSLog(@"%c", maiuscula);