Objective C, ou Objective-C, ou ObjC, é uma linguagem de programação reflectiva orientada a objetos criada nos idos da década de 1980 – mais ou menos na mesma época que o C++ – pelos fundadores da Stepstone, mais tarde adquirida pela NeXT. É na verdade uma camada bem fina sobre a linguagem C padrão.
Isso significa que, se você sabe programar em C, conseguirá programar em ObjC sem muito esforço.
Diferenças para C
Sobre a linguagem C, ObjC adiciona os seguintes recursos:
- Orientação a objetos, adaptada de Smalltalk.
- Tipo boleano –
BOOL
. Verdadeiro éYES
e falso éNO
. - Comentário de linha, iniciado por
//
(na época C não suportava). - A diretiva de preprocessador
#import
, que funciona como#include
, mas só inclui o cabeçalho se ele não foi incluído ainda. - O tipo
id
, similar avoid *
de C/C++. - A constante
nil
, que é um objetoid
sem valor:(id)0
.
A maior parte dos comandos referentes a orientação a objetos começam com
@
, como @interface
, @implementation
, @end
, @private
, @protected
, @public
, @protocol
, etc.… Entre colchetes é avaliado o ambiente de mensagem, com uma sintaxe muito parecida com a de Smalltalk.Criando uma classe
Como exemplo, vamos criar a classe
Point
, com os atributos x
e y
.Para tanto, primeiro criamos a interface no arquivo
Point.h
:#ifndef _POINT_H
#define _POINT_H
#import <Foundation/Foundation.h>
@interface Point : NSObject
{
int x;
int y;
}
+ (id) newWithX: (int)valuex Y: (int)valuey;
- (id) initWithX: (int)valuex Y: (int)valuey;
- (int) diagonal;
- (int) getX;
- (int) getY;
- (void) setX: (int)value;
- (void) setY: (int)value;
@end
#endif
As diretivas
#ifndef
, #define
e #endif
já são velhas conhecidas dos programadores C/C++. O #import
já foi explicado, funciona parecido com #include
.O cabeçalho
Foundation/Foundation.h
inclui a classe NSObject
, definida pela API OpenStep, usada aqui como classe pai de nossa classe Point
.O comando
@interface
inicia a descrição da interface e o comando @end
encerra. O pequeno escopo entre chaves define os atributos de instância, protegidos por padrão – para defini-los como públicos a sintaxe seria:{
@public
int x;
int y;
}
As linhas começadas por um sinal de menos (
-
) indicam métodos de instância – métodos de classe são iniciados por +
. Por exemplo:- (id) initWithX: (int)valuex Y: (int)valuey;
Significa um método de instância que recebe dois atributos inteiros –
valuex
e valuey
, e retorna um id
.Agora precisamos implementar a interface. Para isso vamos criar o arquivo
Point.m
:#include <math.h>
#import "Point.h"
@implementation Point
+ (id) newWithX: (int)valuex Y: (int)valuey {
return [[Point alloc]
initWithX: valuex Y: valuey];
}
- (id) initWithX: (int)valuex Y: (int)valuey {
if ((self = [super init])) {
x = valuex;
y = valuey;
}
return self;
}
- (int) diagonal {
return (int) sqrt((double) ((x * x) + (y * y)));
}
- (int) getX {
return x;
}
- (int) getY {
return y;
}
- (void) setX: (int)value {
x = value;
}
- (void) setY: (int)value {
y = value;
}
@end
O código é muito parecido com C, e até mesmo com C++, cabendo apenas alguns comentários:
self
é uma palavra reservada que representa a instância, comothis
de Java e C++.super
referencia a classe pai, como em Java.- Repare no comando
[super init]
: aqui é passada uma mensagem parasuper
e o valor retornado é atribuído aself
.
Para instanciar um objeto, a sintaxe é:
id point = [Point newWithX: 4 Y: 5];
Ou, com tipagem estática:
Point *point = [Point newWithX: 4 Y: 5];
Para obter o valor de
x
:printf("x = %d\n", [point getX]);
E para mudar seu valor:
[point setX: 2];
OpenStep
OpenStep é a API aberta para desenvolvimento de aplicações para NEXTSTEP, resultado de um trabalho colaborativo da NeXT com a SUN Microsystems.
Diversos sistemas e ambientes oferecem suporte a OpenStep, como OS X e GNUstep.
Diversos recursos interessantes são oferecidos nessa API, desde vantagens semelhantes à STL de C++, até conjunto de widgets para construção de janelas, toolkit.
Já vimos uma classe dessa API,
NSObject
. Outra interessante é NSString
, cuja finalidade é a mesma de std::string
de C++ e String
de Java.A criação de uma
NSString
é:id url = [NSString stringWithCString: "http://kodumaro.blogspot.com/"];
Há ainda um apelido sintático:
id url = @"http://kodumaro.blogspot.com/";
Um forma legal de conhecer mais sobre OpenStep é ler os manuais de referência do GNUstep (toolkit aqui) e do OS X.
[]'s
Cacilhas, La Batalema