Você está na página 1de 105

Apostila sobre Objective C

Objective-C Tutorial
Objective-C é um de uso geral, linguagem de programação orientada a objeto que adiciona mensagens
Smalltalk-estilo para a linguagem de programação C. Esta é a principal linguagem de programação
usada pela Apple para o Mac OS X e iOS sistemas operacionais e suas respectivas APIs, Cacau e
Cocoa Touch.
Esta referência vai levá-lo através de uma abordagem simples e prática ao mesmo tempo aprender a
linguagem de programação Objective-C.

Público
Esta referência foi preparado para os iniciantes para ajudá-los a entender o básico para conceitos
avançados relacionados às linguagens de programação Objective-C.

Pré-requisitos
Antes de começar a fazer a prática com vários tipos de exemplos dados nesta referência, eu estou
fazendo uma suposição de que você já está ciente sobre o que é um programa de computador eo que é
uma linguagem de programação de computadores?

Compilar / executar programas Objective-C


Para a maioria dos exemplos dados neste tutorial, você vai encontrar Experimente opção para
compilar e executar programas Objective-C on-line, então basta fazer uso dele e desfrutar da sua
aprendizagem.
Tente o seguinte exemplo usando Experimente opção disponível no canto superior direito da caixa
de código de exemplo a seguir -
#import <Foundation/Foundation.h>

int main()
{
/* my first program in Objective-C */
NSLog(@"Hello, World! \n");

return 0;
}

1 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C

Objective-C Visão geral


Objective-C é uma linguagem de propósito geral que é desenvolvido em cima da linguagem de
programação C, adicionando recursos de linguagem de programação Small Talk tornando-se uma
linguagem orientada a objetos. Ele é usado principalmente no desenvolvimento de iOS e sistemas
operacionais Mac OS X, bem como suas aplicações.
Inicialmente, Objective-C foi desenvolvido pela NeXT por sua NeXTSTEP OS de quem foi tomado
pela Apple para seus iOS e Mac OS X.

Programação Orientada a Objetos


Totalmente suporta a programação orientada a objetos, incluindo os quatro pilares do desenvolvimento
orientado a objeto:
• encapsulamento
• ocultamento de dados
• Herança
• Polimorfismo

exemplo de código
#import <Foundation/Foundation.h>

int main (int argc, const char * argv[])


{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

NSLog (@"hello world");


[pool drain];
return 0;
}

Quadro Foundation
Fundação Framework fornece grande conjunto de recursos e eles estão listados abaixo.

2 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
• Ele inclui uma lista de tipos de dados estendidos como NSArray, NSDictionary, NSSet e assim
por diante.
• É composto por um rico conjunto de funções de manipulação de arquivos, cordas, etc.
• Ele fornece recursos para a manipulação de URL, serviços públicos, como a formatação da data,
manipulação de dados, manipulação de erro, etc.

Aprender Objective-C
A coisa mais importante a fazer quando aprender Objective-C é concentrar-se em conceitos e não se
perder na língua detalhes técnicos.
O propósito de aprender uma linguagem de programação é para se tornar um programador melhor; ou
seja, para tornar-se mais eficaz na elaboração e implementação de novos sistemas e em manter os
antigos.

Uso de Objective-C
Objective-C, como mencionado anteriormente, é usado em iOS e Mac OS X. Ele tem grande base de
usuários de iOS e em grande parte aumentando os usuários do Mac OS X. E desde que a Apple se
concentra em qualidade em primeiro lugar e seu maravilhoso para aqueles que começou a aprender
Objective-C.

Objective-C Configuração de ambiente


Experimente-opção on-line
Você realmente não precisa configurar seu próprio ambiente para começar a aprender linguagem
de programação Objective-C. A razão é muito simples, nós já criaram ambiente de programação
Objective-C on-line, de modo que você pode compilar e executar todos os exemplos disponíveis
on-line ao mesmo tempo quando você está fazendo o seu trabalho teoria. Isto dá-lhe confiança no
que você está lendo e conferir o resultado com diferentes opções. Sinta-se livre para modificar
qualquer exemplo e executá-lo online.

Tente o seguinte exemplo usando Experimente opção disponível no canto superior direito da
caixa de código de exemplo a seguir:

#import <Foundation/Foundation.h>

int main()

3 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
{
/* my first program in Objective-C */
NSLog(@"Hello, World! \n");

return 0;
}

Para a maioria dos exemplos dados neste tutorial, você vai encontrar Experimente opção, então
basta fazer uso dele e desfrutar da sua aprendizagem.

Configuração do Ambiente Local


Se você ainda estiver disposto a configurar o ambiente para a linguagem de programação Objective-C,
você precisa dos dois softwares seguintes disponível no seu computador, (a) editor de texto e (b) O
GCC Compiler.

Editor de texto
Isso será usado para escrever o programa. Exemplos de alguns editores incluem Windows Notepad,
comando OS Editar, Breve, Epsilon, Emacs e vim ou vi.
Nome e versão do editor de texto pode variar em diferentes sistemas operacionais. Por exemplo, o
Bloco de notas será usado no Windows, e vim ou vi pode ser usado em janelas, bem como Linux ou
UNIX.
Os arquivos que você cria com o seu editor são chamados de arquivos de origem e contêm código fonte
do programa. Os arquivos de origem para os programas de Objective-C são geralmente nomeados com
a extensão ".m".
Antes de iniciar sua programação, certifique-se de ter um editor de texto no lugar e você tem
experiência suficiente para escrever um programa de computador, salve-o em um arquivo, compilá-lo
e, finalmente, executá-lo.

O GCC Compiler
O código-fonte escrito em arquivo de origem é a fonte legível para o seu programa. Ele precisa ser
"compilada" para se transformar em linguagem de máquina, de modo que o seu CPU pode realmente
executar o programa de acordo com as instruções dadas.
Este compilador GCC será usado para compilar o código fonte em programa executável final. Eu
suponho que você tenha conhecimento básico sobre um compilador de linguagem de programação.

4 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
compilador GCC está disponível gratuitamente em várias plataformas e o procedimento para configurar
em várias plataformas é explicado abaixo.

Instalação em UNIX / Linux


O passo inicial é instalar o gcc, juntamente com o pacote de Objective-C gcc. Isto é feito por:
$ su -
$ yum install gcc
$ yum install gcc-objc

O próximo passo é a criação de dependências de pacotes usando seguinte comando:


$ yum install make libpng libpng-devel libtiff libtiff-devel libobjc libxml2
libxml2-devel libX11-devel libXt-devel libjpeg libjpeg-devel

A fim de obter todas as características de Objective-C, baixar e instalar GNUStep. Isto pode ser feito
através do download do pacote a partir http://main.gnustep.org/resources/downloads.php .
Agora, precisamos mudar para a pasta de download e descompactar o arquivo:
$ tar xvfz gnustep-startup-.tar.gz

Agora, precisamos mudar para a pasta gnustep-inicialização que é criado usando:


$ cd gnustep-startup-

Em seguida, é necessário configurar o processo de compilação:


$ ./configure

Então, podemos construir por:


$ make

Precisamos, finalmente, configurar o ambiente por:


$ . /usr/GNUstep/System/Library/Makefiles/GNUstep.sh

Temos um helloWorld.m Objectivo-C da seguinte forma:


#import <Foundation/Foundation.h>

int main (int argc, const char * argv[])


{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSLog (@"hello world");
[pool drain];
return 0;

5 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
}

Agora, podemos compilar e executar um arquivo de Objective-C dizer helloWorld.m por mudar para a
pasta que contém o arquivo usando cd e, em seguida, utilizando os seguintes passos:
$ gcc `gnustep-config --objc-flags` -L/usr/GNUstep/Local/Library/Libraries
-lgnustep-base helloWorld.m -o helloWorld
$ ./helloWorld

Nós podemos ver o seguinte resultado:


2013-09-07 10:48:39.772 tutorialsPoint[12906] hello world

Instalação no Mac OS
Se você usa o Mac OS X, a maneira mais fácil de obter GCC é fazer o download do ambiente de
desenvolvimento Xcode do site da Apple e siga as instruções de instalação simples. Depois de ter
Xcode configurado, você será capaz de usar o compilador GNU para C / C ++.
Xcode está atualmente disponível em developer.apple.com/technologies/tools/ .

Instalação no Windows
A fim de executar o programa de Objective-C em Windows, é preciso instalar o MinGW e GNUStep
Core. Ambos estão disponíveis em http://www.gnu.org/software/gnustep/windows/installer.html .
Em primeiro lugar, é preciso instalar o pacote Sistema MSYS / MinGW. Então, precisamos instalar o
pacote GNUstep Core. Ambos os quais fornecem um instalador do Windows, que é auto-explicativo.
Em seguida, usar Objective-C e GNUstep selecionando Iniciar -> Todos os programas -> GNUstep ->
Shell
Alterne para a pasta que contém helloWorld.m
Podemos compilar o programa usando:
$ gcc `gnustep-config --objc-flags` -L /GNUstep/System/Library/Libraries hello.m -o
hello -lgnustep-base -lobjc

Podemos executar o programa usando:


./hello.exe

Ficamos com o seguinte resultado:


2013-09-07 10:48:39.772 tutorialsPoint[1200] hello world

6 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C

Objective-C Estrutura do programa


Antes de estudar blocos de construção básicos da linguagem de programação Objective-C, vamos olhar
uma estrutura mínimo programa de Objective-C para que possamos tomá-lo como uma referência nos
próximos capítulos.

Objective-C Exemplo mundo Olá!


Um programa de Objective-C, basicamente, consiste nas seguintes partes:
• Comandos de pré-processamento
• Interface
• Implementação
• Método
• variáveis
• Declarações e expressões
• Comentários
Vejamos um simples código que iria imprimir as palavras "Olá Mundo":
#import <Foundation/Foundation.h>

@interface SampleClass:NSObject
- (void)sampleMethod;
@end

@implementation SampleClass

- (void)sampleMethod{
NSLog(@"Hello, World! \n");
}

@end

int main()
{
/* my first program in Objective-C */
SampleClass *sampleClass = [[SampleClass alloc]init];
[sampleClass sampleMethod];
return 0;
}

Vejamos várias partes do programa acima:

7 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
1. A primeira linha do programa#import <Foundation / Foundation.h>é um comando de pré-
processamento, que informa um compilador Objective-C para incluir arquivo Foundation.h
antes de ir para a compilação real.
2. A próxima@ interfacede linhaSampleClass: NSObjectmostra como criar uma interface. Ele
herda NSObject, que é a classe base de todos os objetos.
3. A linha seguinte- (void) sampleMethod;mostra como declarar um método.
4. O próximo@endlinha marca o fim de uma interface.
5. A próxima linha@implementation SampleClassmostra como implementar a interface
SampleClass.
6. A linha seguinte- (void) {} sampleMethodmostra a implementação do sampleMethod.
7. O próximo@endlinha marca o fim de uma implementação.
8. Ointpróxima linhamain ()é a função principal, onde a execução do programa começa.
9. A próxima linha /*...*/ será ignorado pelo compilador e foi colocado para adicionar comentários
adicionais no programa. Então, essas linhas são chamadas de comentários no programa.
10.A próxima linhaNSLog (...)é outra função disponível em Objective-C que faz com que a
mensagem "Olá, mundo!" para ser apresentada no ecrã.
11.A próxima linha deretorno 0, termina a função main () e retorna o valor 0.

Compilar e executar Programa de Objective-C:


Agora, quando compilar e executar o programa, iremos obter o seguinte resultado.
2013/09/07 22: 38: 27,932 demonstração [28001] Olá, mundo!

Objective-C Sintaxe básica


Você já viu uma estrutura básica do programa de Objective-C, por isso vai ser fácil de entender outros
blocos de construção básicos da linguagem de programação Objective-C.

8 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
Tokens em Objective-C
Um programa de Objective-C é composto por vários símbolos e um token ou é uma palavra-chave, um
identificador, uma constante, uma string literal, ou um símbolo. Por exemplo, a seguinte declaração
Objective-C é composto por seis fichas:
NSLog(@"Hello, World! \n");

Os sinais individuais são os seguintes:


NSLog
@
(
"Hello, World! \n"
)
;

ponto e vírgula;
No programa de Objective-C, o ponto e vírgula é um terminador de instrução. Ou seja, cada instrução
individual deve ser terminou com um ponto e vírgula. Ele indica o fim de uma entidade lógica.
Por exemplo, a seguir estão duas declarações diferentes:
NSLog(@"Hello, World! \n");
return 0;

Comentários
Comentários são como ajudando texto em seu programa de Objective-C e são ignorados pelo
compilador. Eles começam com / * e terminam com os caracteres * /, como mostrado abaixo:
/* my first program in Objective-C */

Você não pode ter comentários com em comentários e eles não ocorrem dentro de uma cadeia de
caracteres ou literais.

identificadores
Um identificador Objective-C é um nome usado para identificar uma variável, função ou qualquer
outro item definido pelo usuário. Um identificador começa com uma letra de A a Z ou A a Z ou um
sublinhado _ seguido de zero ou mais letras, sublinhados e dígitos (0 a 9).

9 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
O Objective-C não permite caracteres de pontuação, tais como @, $ e% dentro do identificador.
Objective-C é uma linguagem de programaçãomaiúsculas de
minúsculas.Assim,Manpoweremãodeobrasão dois identificadores diferentes em Objective-C. Aqui
estão alguns exemplos de identificadores aceitáveis:
mohd zara abc move_name a_123
myname50 _temp j a23b9 retVal

Palavras-chave
A lista a seguir mostra algumas das palavras reservadas em Objective-C. Estas palavras reservadas não
podem ser utilizados como constante ou variável ou quaisquer outros nomes de identificadores.

auto else long switch


break enum register typedef
case extern return union
char float shot unsigned
const for signed void
continue goto sizeof volatile
default If static while
do int struct _Packed
doble protocol interface implementation
NSObject NSInteger NSNumber CGFloat
property nonatomic retain string
weak unsafe_unretained readwrite readonly

Espaços em branco em Objective-C


A linha que contém somente espaços em branco, possivelmente com um comentário, é conhecida como
uma linha em branco, e um compilador Objective-C totalmente ignora.
Espaço em branco é o termo usado em Objective-C para descrever espaços em branco, tabulações,
caracteres de nova linha e comentários. Espaço em branco separa uma parte de uma declaração de
outro e permite que o compilador para identificar onde um elemento em um comunicado, tais como int,
as extremidades e o elemento seguinte começa. Portanto, na seguinte declaração:
int age;

Deve haver, pelo menos, um espaço em branco (geralmente um espaço) entre int idade e para o
compilador para ser capaz de distinguir. Por outro lado, na seguinte declaração,
fruit = apples + oranges; // get the total fruit

10 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
não há espaços em branco são necessários entre frutas e =, ou entre = e maçãs, embora você está livre
para incluir alguns se desejar para fins de legibilidade.

Objective-C Tipos de dados


Na linguagem de programação Objective-C, tipos de dados referem-se a um extenso sistema usado para
declarar variáveis ou funções de diferentes tipos. O tipo de uma variável determina a quantidade de
espaço que ocupa no armazenamento e como o padrão de bits armazenados é interpretada.
Os tipos em Objective-C podem ser classificados da seguinte forma:

SN Tipos e descrição
Tipos básicos: Eles são tipos de aritmética e consistem em dois tipos: (a) os tipos inteiros e (b)
1 tipos de ponto flutuante.

Tipos enumerados: Eles são novamente tipos de aritmética e eles são usados para definir
2 variáveis que só podem ser atribuídos certos valores discretos inteiros ao longo do programa.

O tipo void: Ovaziotipo especificador indica que nenhum valor está disponível.
3
Tipos derivados: Eles incluem (a) tipos de ponteiro, (b) os tipos de matriz, tipos de estrutura (c),
4 (d) tipos da União e (e) Tipos de função.

Os tipos de matriz e tipos de estrutura são referidos coletivamente como os tipos de agregação. O tipo
de uma função especifica o tipo de valor de retorno da função. Veremos tipos básicos na seção seguinte
passo que outros tipos serão abordados nos próximos capítulos.

Tipos inteiros
A tabela a seguir dá-lhe detalhes sobre os tipos inteiros padrão com seus tamanhos de armazenamento e
faixas de valores:

Digitar tamanho de armazenamento faixa de valores


carbonizar 1 byte -128 A 127 ou 0 a 255
unsigned char 1 byte 0 a 255
signed char 1 byte -128 A 127
int 2 ou 4 bytes 32.768 a 32.767 ou 2,147,483,648 a 2.147.483.647
int não assinado 2 ou 4 bytes 0 a 65.535 ou 0 a 4,294,967,295

11 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
baixo 2 bytes 32.768 a 32.767
unsigned short 2 bytes 0 a 65.535
longo 4 bytes -2.147.483.648 a 2.147.483.647
unsigned long 4 bytes 0 a 4294967295
Para obter o tamanho exato de um tipo ou uma variável em uma plataforma específica, você pode usar
o operadorsizeof.A expressãosizeof (tipo)produz o tamanho de armazenamento do objeto ou tipo em
bytes. A seguir é um exemplo para obter o tamanho do tipo int em qualquer máquina:
#import <Foundation/Foundation.h>

int main()
{
NSLog(@"Storage size for int : %d \n", sizeof(int));

return 0;
}

Quando você compilar e executar o programa acima, produz o seguinte resultado no Linux:
2013-09-07 22:21:39.155 demo[1340] Storage size for int : 4

Tipos de ponto flutuante


A tabela a seguir dá-lhe detalhes sobre os tipos padrão de ponto-flutuante com tamanhos de
armazenamento e faixas de valores e sua precisão:

Digitar tamanho de armazenamento faixa de valores Precisão


flutuador 4 byte 1,2E-38 3,4E + 38 a 6 casas decimais
duplo 8 byte 2.3E-308 para 1.7e + 308 15 casas decimais
long double 10 byte 3.4E-4932 para 1.1E + 4932 19 casas decimais
O float.h arquivo cabeçalho define macros que permitem que você use esses valores e outros detalhes
sobre a representação binária de números reais em seus programas. Seguindo o exemplo irá imprimir
espaço de armazenamento ocupado por um tipo float e seus valores de intervalo:
#import <Foundation/Foundation.h>

int main()
{
NSLog(@"Storage size for float : %d \n", sizeof(float));

return 0;
}

Quando você compilar e executar o programa acima, produz o seguinte resultado no Linux:

12 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
2013-09-07 22:22:21.729 demo[3927] Storage size for float : 4

O tipo nulo
O tipo void especifica que nenhum valor está disponível. Ele é utilizado em três tipos de situações:

SN Tipos e descrição
Função retorna nulo Existem várias funções em Objective-C, que não retornam valor ou você
pode dizer que voltará vazia. Uma função com nenhum valor de retorno tem o tipo de retorno
1
nulo. Por exemplo, asaída void (int status);

Argumentos de funções como nulos Existem várias funções em Objective-C que não aceitam
qualquer parâmetro. Uma função com nenhum parâmetro pode aceitar como um vazio. Por
2
exemplo,rand int (void);

O tipo void não pode ser entendido como você neste momento, por isso vamos continuar e vamos
cobrir esses conceitos em próximos capítulos.

Objective-C variáveis
Uma variável é nada além de um nome dado a uma área de armazenamento que os nossos programas
podem manipular. Cada variável em Objective-C tem um tipo específico, que determina o tamanho eo
layout da memória da variável; a gama de valores que podem ser armazenadas dentro de que a
memória; e o conjunto de operações que pode ser aplicada à variável.
O nome de uma variável pode ser composto de letras, números e o caractere sublinhado. Ele deve
começar com uma letra ou um sublinhado. Superior e letras minúsculas são distintos porque Objective-
C é sensível a maiúsculas. Com base nos tipos básicos explicados no capítulo anterior, haverá os
seguintes tipos de variáveis básicas:

Digitar Descrição
carbonizar Tipicamente, um único octeto (um byte). Este é um tipo inteiro.
int O tamanho natural mais de inteiro para a máquina.
flutuador Um valor de ponto flutuante de precisão simples.
duplo Um valor de ponto flutuante de precisão dupla.
vazio Representa a ausência de tipo.

13 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
Objective-C linguagem de programação também permite definir vários outros tipos de variáveis, que
iremos cobrir em capítulos posteriores, como a enumeração, Pointer, Array, Estrutura, União, etc. Para
este capítulo, vamos estudar apenas os tipos de variáveis básicas.

Definição variável em Objective-C:


A definição da variável significa para dizer ao compilador onde e quanto para criar o armazenamento
para a variável. Uma definição variável especifica um tipo de dados e que contém uma lista de uma ou
mais variáveis desse tipo como se segue:
type variable_list;

Aqui, tipo deve ser um tipo de dados Objective-C válida incluindo char, w_char, int, float, double,
bool ou qualquer objeto definido pelo usuário, etc., e variable_list pode consistir em um ou mais
nomes de identificadores separados por vírgulas. Algumas declarações válidas são mostrados aqui:
int i, j, k;
char c, ch;
float f, salary;
double d;

A linha int i, j, k; ambos declara e define as variáveis de i, j e k; que instrui o compilador para criar
variáveis nomeadas i, j, k do tipo int.
As variáveis podem ser inicializados (atribuído um valor inicial) na sua declaração. O inicializador é
composto por um sinal de igual seguido por uma expressão constante como se segue:
type variable_name = value;

Alguns exemplos são os seguintes:


extern int d = 3, f = 5; // declaration of d and f.
int d = 3, f = 5; // definition and initializing d and f.
byte z = 22; // definition and initializes z.
char x = 'x'; // the variable x has the value 'x'.

Por definição, sem um inicializador: variáveis com duração de armazenagem estática são
implicitamente inicializado com NULL (todos os bytes têm o valor 0); o valor inicial de todas as outras
variáveis é indefinido.

Declaração de variável em Objective-C:


Uma declaração de variável constitui uma garantia para o compilador que há um já existente variável
com o tipo de dado e nome para que compilador proceder para posterior compilação sem precisar

14 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
detalhes completos sobre a variável. Uma declaração de variável tem o seu significado no momento da
compilação única, compilador precisa declaração de variável real no momento da ligação do programa.
Uma declaração de variável é útil quando você estiver usando vários arquivos e você definir seu
variável em um dos arquivos, que estarão disponíveis no momento da ligação do programa. Você vai
usar palavra-chave externo para declarar uma variável em qualquer lugar. Embora você pode
declarar uma variável várias vezes em seu programa de Objective-C, mas pode ser definido apenas uma
vez em um arquivo, uma função ou um bloco de código.

Exemplo
Tente o seguinte exemplo, onde as variáveis foram declarados no topo, mas eles têm sido definido e
inicializado dentro da função principal:
#import <Foundation/Foundation.h>

// Variable declaration:
extern int a, b;
extern int c;
extern float f;

int main ()
{
/* variable definition: */
int a, b;
int c;
float f;

/* actual initialization */
a = 10;
b = 20;

c = a + b;
NSLog(@"value of c : %d \n", c);

f = 70.0/3.0;
NSLog(@"value of f : %f \n", f);

return 0;
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado:


2013-09-07 22:43:31.695 demo[14019] value of c : 30
2013-09-07 22:43:31.695 demo[14019] value of f : 23.333334

O mesmo conceito se aplica na declaração de função onde você fornecer um nome de função no
momento da sua declaração e sua definição real pode ser dada em qualquer outro lugar. No exemplo a

15 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
seguir, é explicado utilizando a função C e como você sabe Objective-C suporta funções de estilo C
também:
// function declaration
int func();

int main()
{
// function call
int i = func();
}

// function definition
int func()
{
return 0;
}

Lvalues e Rvalues em Objective-C:


Existem dois tipos de expressões em Objective-C:
1. lvalue: Expressões que se referem a um local de memória é chamado de "lvalue"
expressão. Um lvalue pode aparecer como quer do lado esquerdo ou do lado direito de uma
atribuição.
2. rvalue: O termo rvalue refere-se a um valor de dados que é armazenada em algum
endereço na memória. Um rvalue é uma expressão que não pode ter um valor atribuído a ele o
que significa um rvalue pode aparecer no lado direita, mas não do lado esquerdo de uma
atribuição.
As variáveis são lvalues e assim pode aparecer no lado esquerdo de uma atribuição. literais numéricos
são rvalues e por isso não pode ser atribuído e não pode aparecer no lado da mão esquerda. A seguir é
uma declaração válida:
int g = 20;

Mas a seguir não é uma declaração válida e geraria erro de compilação:


10 = 20;

Objective-C constantes

16 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
As constantes referem-se a valores fixos que o programa não pode alterar durante sua execução. Estes
valores fixos também são chamados deliterais.
Constantes podem ser de qualquer dos tipos de dados básicos, comouma constante inteira, uma
constante flutuante, um personagem constante, ou uma string literal.Há também constantes de
enumeração bem.
Asconstantes são tratados como variáveis regulares, exceto que seus valores não podem ser
modificadas após a sua definição.

literais inteiros
Um número inteiro literal pode ser um decimal, octal, ou constante hexadecimal. Um prefixo especifica
a base ou raiz: 0x ou 0X para hexadecimal, 0 para octal, e nada para decimal.
Um número inteiro literal também pode ter um sufixo que é uma combinação de L e L, para não
assinado e tempo, respectivamente. O sufixo pode ser maiúsculas ou minúsculas e podem estar em
qualquer ordem.
Aqui estão alguns exemplos de literais inteiros:
212 /* Legal */
215u /* Legal */
0xFeeL /* Legal */
078 /* Illegal: 8 is not an octal digit */
032UU /* Illegal: cannot repeat a suffix */

Seguem-se outros exemplos de vários tipos de literais inteiro:


85 /* decimal */
0213 /* octal */
0x4b /* hexadecimal */
30 /* int */
30u /* unsigned int */
30l /* long */
30ul /* unsigned long */

literais de ponto flutuante


Um ponto flutuante literal tem uma parte inteira, um ponto decimal, uma parte fracionária, e uma parte
expoente. Você pode representar literais de ponto flutuante, quer na forma decimal ou forma
exponencial.

17 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
Embora represente usando forma decimal, você deve incluir o ponto decimal, o expoente, ou ambos, e
ao representar usando forma exponencial, você deve incluir a parte inteira, parte fraccionária, ou
ambos. O expoente assinado é introduzido por e ou E.
Aqui estão alguns exemplos de literais de ponto flutuante:
3.14159 /* Legal */
314159E-5L /* Legal */
510E /* Illegal: incomplete exponent */
210f /* Illegal: no decimal or exponent */
.e55 /* Illegal: missing integer or fraction */

constantes de caracteres
Literais de caracteres são colocados entre aspas simples, por exemplo, 'x' e pode ser armazenado em
uma simples variável do tipo char.
Um personagem literal pode ser um personagem simples (por exemplo, 'x'), uma sequência de escape
(por exemplo, '\ t'), ou um carácter universal (por exemplo, '\ u02C0').
Há certos caracteres em C quando são procediam por uma barra invertida terão significado especial e
eles são usados para representar como nova linha (\ n) ou tabulação (\ t). Aqui, você tem uma lista de
alguns desses códigos de sequência de escape:

sequência de escape Significado


\\ \ personagem
\' ' personagem
\" " personagem
\? ? personagem
\uma Alerta ou sino
\b retrocesso
\f O avanço de página
\n Nova linha
\r retorno de carro
\t guia horizontal
\v guia Vertical
\ ooo número Octal de um a três dígitos
\ Xhh. . . número hexadecimal de um ou mais dígitos
Segue-se o exemplo para mostrar alguns caracteres de sequência de escape:
#import <Foundation/Foundation.h>

int main()

18 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
{
NSLog(@"Hello\tWorld\n\n");

return 0;
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado:


2013-09-07 22:17:17.923 demo[17871] Hello World

strings literais
strings literais ou constantes são entre aspas "". A cadeia contém caracteres que são semelhantes aos
literais de caracteres: caracteres simples, seqüências de escape e caracteres universais.
Você pode quebrar uma longa linha em várias linhas usando strings literais e separando-os usando
espaços em branco.
Aqui estão alguns exemplos de strings literais. Todas as três formas são sequências idênticas.
"hello, dear"

"hello, \

dear"

"hello, " "d" "ear"

definir constantes
Existem duas maneiras simples em C para definir constantes:
1. Usando pré-processador#define.
2. Usando palavras-chaveconst.

O pré-processador #define
Segue-se o formulário para usar # define pré-processador para definir uma constante:
#define identifier value

Seguindo o exemplo explica isso em detalhes:


#import <Foundation/Foundation.h>

19 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
#define LENGTH 10
#define WIDTH 5
#define NEWLINE '\n'

int main()
{

int area;

area = LENGTH * WIDTH;


NSLog(@"value of area : %d", area);
NSLog(@"%c", NEWLINE);

return 0;
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado:


2013-09-07 22:18:16.637 demo[21460] value of area : 50
2013-09-07 22:18:16.638 demo[21460]

A palavra-chave const
Você pode usar o prefixoconst para declarar constantes com um tipo específico da seguinte forma:
const type variable = value;

Seguindo o exemplo explica isso em detalhes:


#import <Foundation/Foundation.h>

int main()
{
const int LENGTH = 10;
const int WIDTH = 5;
const char NEWLINE = '\n';
int area;

area = LENGTH * WIDTH;


NSLog(@"value of area : %d", area);
NSLog(@"%c", NEWLINE);

return 0;
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado:


2013-09-07 22:19:24.780 demo[25621] value of area : 50
2013-09-07 22:19:24.781 demo[25621]

Note-se que é uma boa prática de programação para definir constantes em MAIÚSCULAS.

20 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C

Objective-C operadores
Um operador é um símbolo que indica o compilador para executar manipulações matemáticas ou
lógicas específicas. linguagem Objective-C é rico em operadores internos e fornece os seguintes tipos
de operadores:
• Operadores aritméticos
• Operadores relacionais
• Operadores lógicos
• Operadores bit a bit
• Operadores de atribuição
• Operadores Diversos
Este tutorial irá explicar a aritmética, relacional, lógico, bit a bit, atribuição e outros operadores, um por
um.

Operadores aritméticos
A tabela a seguir mostra todos os operadores aritméticos suportados pela linguagem Objective-C.
Suponha que a variável A detém 10 e variável B detém 20, então:
A tabela a seguir mostra todos os operadores aritméticos suportados pela linguagem Objective-C.
Suponha que a variável A detém 10 e variável B detém 20, então:

Operador Descrição Exemplo


+ Adiciona dois operandos A + B vai dar 30
- Subtrai segundo operando a partir do primeiro A - B dará -10
* Multiplica os dois operandos A * B vai dar 200
/ Divide numerador pelo denominador B / A vai dar 2
% Modulus Operador e restante depois de uma divisão inteira B% A irá dar 0
++ Incrementa operador aumenta valor inteiro por um A ++ irá dar 11
- operador decréscimos diminui valor inteiro por um A-- vai dar 9

Exemplo
Tente o seguinte exemplo para entender todos os operadores aritméticos disponíveis em linguagem de
programação Objective-C:

21 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
#import <Foundation/Foundation.h>

main()
{
int a = 21;
int b = 10;
int c ;

c = a + b;
NSLog(@"Line 1 - Value of c is %d\n", c );
c = a - b;
NSLog(@"Line 2 - Value of c is %d\n", c );
c = a * b;
NSLog(@"Line 3 - Value of c is %d\n", c );
c = a / b;
NSLog(@"Line 4 - Value of c is %d\n", c );
c = a % b;
NSLog(@"Line 5 - Value of c is %d\n", c );
c = a++;
NSLog(@"Line 6 - Value of c is %d\n", c );
c = a--;
NSLog(@"Line 7 - Value of c is %d\n", c );

Quando você compilar e executar o programa acima, produz o seguinte resultado:


2013-09-07 22:10:27.005 demo[25774] Line 1 - Value of c is 31
2013-09-07 22:10:27.005 demo[25774] Line 2 - Value of c is 11
2013-09-07 22:10:27.005 demo[25774] Line 3 - Value of c is 210
2013-09-07 22:10:27.005 demo[25774] Line 4 - Value of c is 2
2013-09-07 22:10:27.005 demo[25774] Line 5 - Value of c is 1
2013-09-07 22:10:27.005 demo[25774] Line 6 - Value of c is 21
2013-09-07 22:10:27.005 demo[25774] Line 7 - Value of c is 22

Operador Descrição Exemplo


+ Adiciona dois operandos A + B vai dar 30
- Subtrai segundo operando a partir do primeiro A - B dará -10
* Multiplica os dois operandos A * B vai dar 200
/ Divide numerador pelo denominador B / A vai dar 2
% Modulus Operador e restante depois de uma divisão inteira B% A irá dar 0
++ operador de incremento aumenta valor inteiro por um A ++ irá dar 11
- operador de decremento diminui valor inteiro por um A-- vai dar 9

Operadores relacionais
A tabela a seguir mostra todos os operadores relacionais suportados pela linguagem Objective-C.
Suponha que a variável A detém 10 e variável B detém 20, então:

22 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
A tabela a seguir mostra todos os operadores relacionais suportados pela linguagem Objective-C.
Suponha que a variável A detém 10 e variável B detém 20, então:

Operador Descrição Exemplo


Verifica se os valores de dois operandos são iguais ou não, se sim, (A == B) não é
==
então a condição se torna verdade. verdade.
Verifica se os valores de dois operadores são iguais ou não, se os (A! = B) é
!=
valores não são iguais então a condição torna-se verdade. verdadeiro.
Verifica se o valor do operando esquerdo é maior do que o valor do (A> B) não é
>
operando à direita, se sim, então condição torna-se verdade. verdade.
Verifica se o valor do operando à esquerda é menor do que o valor do (A <B) é
<
operando à direita, se sim, então condição torna-se verdade. verdadeiro.
Verifica se o valor do operando à esquerda é maior do que ou igual ao
(A> = B) não é
>= valor de operando à direita, se sim, então a condição torna-se
verdade.
verdadeiro.
Verifica se o valor do operando esquerdo é menos do que ou igual ao
(A <= B) é
<= valor de operando à direita, se sim, então a condição torna-se
verdadeiro.
verdadeiro.

Exemplo
Tente o seguinte exemplo para entender todos os operadores relacionais disponíveis em linguagem de
programação Objective-C:
#import <Foundation/Foundation.h>

main()
{
int a = 21;
int b = 10;
int c ;

if( a == b )
{
NSLog(@"Line 1 - a is equal to b\n" );
}
else
{
NSLog(@"Line 1 - a is not equal to b\n" );
}
if ( a < b )
{
NSLog(@"Line 2 - a is less than b\n" );
}
else
{
NSLog(@"Line 2 - a is not less than b\n" );

23 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
}
if ( a > b )
{
NSLog(@"Line 3 - a is greater than b\n" );
}
else
{
NSLog(@"Line 3 - a is not greater than b\n" );
}
/* Lets change value of a and b */
a = 5;
b = 20;
if ( a <= b )
{
NSLog(@"Line 4 - a is either less than or equal to b\n" );
}
if ( b >= a )
{
NSLog(@"Line 5 - b is either greater than or equal to b\n" );
}
}

Quando você compilar e executar o programa acima, produz o seguinte resultado:


2013-09-07 22:42:18.254 demo[9486] Line 1 - a is not equal to b
2013-09-07 22:42:18.254 demo[9486] Line 2 - a is not less than b
2013-09-07 22:42:18.254 demo[9486] Line 3 - a is greater than b
2013-09-07 22:42:18.254 demo[9486] Line 4 - a is either less than or equal to b
2013-09-07 22:42:18.254 demo[9486] Line 5 - b is either greater than or equal to b

Operador Descrição Exemplo


Verifica se os valores de dois operadores são iguais ou não; Se sim, (A == B) não é
==
então condição torna-se verdade. verdade.
Verifica se os valores de dois operadores são iguais ou não; se os (A! = B) é
!=
valores não forem iguais, então a condição torna-se verdade. verdadeiro.
Verifica se o valor do operando esquerdo é maior do que o valor do (A> B) não é
>
operando direito; Se sim, então condição torna-se verdade. verdade.
Verifica se o valor do operando à esquerda é menor do que o valor do (A <B) é
<
operando direito; Se sim, então condição torna-se verdade. verdadeiro.
Verifica se o valor do operando esquerdo é maior ou igual ao valor do (A> = B) não é
>=
operando direito; Se sim, então condição torna-se verdade. verdade.
Verifica se o valor do operando à esquerda é menor ou igual ao valor (A <= B) é
<=
do operando direito; Se sim, então condição torna-se verdade. verdadeiro.

Operadores lógicos
A tabela a seguir mostra todos os operadores lógicos suportados pela linguagem Objective-C. Suponha
que a variável A detém 1 e variável B detém 0, então:

24 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
A tabela a seguir mostra todos os operadores lógicos suportados pela linguagem Objective-C. Suponha
que a variável A detém 1 e variável B detém 0, então:

Operador Descrição Exemplo


Chamado operador lógico AND. Se ambos os operandos são diferentes
&& (A && B) é falsa.
de zero, então a condição torna-se verdade.
Chamado operador lógico OR. Se qualquer um dos dois operandos é (A || B) é
||
diferente de zero, então a condição torna-se verdade. verdadeiro.
Chamado Lógico NOT Operador. Use para inverte o estado lógico do
! (A && B) é
! seu operando. Se a condição for verdadeira, então Lógico NÃO
verdadeiro.
operador vai fazer falsas.

Exemplo
Tente o seguinte exemplo para entender todos os operadores lógicos disponíveis em linguagem de
programação Objective-C:
#import <Foundation/Foundation.h>

main()
{
int a = 5;
int b = 20;
int c ;

if ( a && b )
{
NSLog(@"Line 1 - Condition is true\n" );
}
if ( a || b )
{
NSLog(@"Line 2 - Condition is true\n" );
}
/* lets change the value of a and b */
a = 0;
b = 10;
if ( a && b )
{
NSLog(@"Line 3 - Condition is true\n" );
}
else
{
NSLog(@"Line 3 - Condition is not true\n" );
}
if ( !(a && b) )
{
NSLog(@"Line 4 - Condition is true\n" );
}
}

25 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
Quando você compilar e executar o programa acima, produz o seguinte resultado:
2013-09-07 22:35:57.256 demo[19012] Line 1 - Condition is true
2013-09-07 22:35:57.256 demo[19012] Line 2 - Condition is true
2013-09-07 22:35:57.256 demo[19012] Line 3 - Condition is not true
2013-09-07 22:35:57.256 demo[19012] Line 4 - Condition is true

Operador Descrição Exemplo


Chamado operador lógico AND. Se ambos os operandos são não zero,
&& (A && B) é falsa.
então a condição torna-se verdade.
Chamado operador lógico OR. Se qualquer um dos dois operandos é (A || B) é
||
diferente de zero, em seguida, a condição se torna verdade. verdadeiro.
Chamado Lógico NOT Operador. Use para inverte o estado lógico do
! (A && B) é
! seu operando. Se a condição for verdadeira, então Lógico NÃO
verdadeiro.
operador vai fazer falsas.

Operadores bit a bit


operador bit a bit funciona em pedaços e executar pouco a operação bit. As tabelas de verdade para &, |
e ^ são os seguintes:

p q p&q p|q p^q


0 0 0 0 0
0 1 0 1 1
1 1 1 1 0
1 0 0 1 1
Suponha que, se A = 60; e B = 13; agora em formato binário eles serão como se segue:
A = 0011 1100
B = 0000 1101
-----------------
A & B = 0000 1100
A | B = 0011 1101
A ^ B = 0011 0001
~ A = 1100 0011
Os operadores de bit a bit suportados pela linguagem Objective-C são listados na tabela a seguir.
Suponha que a variável A detém 60 e variável B detém 13 então:

26 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
Os operadores de bit a bit suportados pela linguagem Objective-C são listados na tabela a seguir.
Suponha que a variável A detém 60 e variável B detém 13, então:

Operador Descrição Exemplo


cópias binários e Operador um pouco para o
& (A & B) vai dar 12, que é 0000 1100
resultado se ele existe em ambos os operadores.
cópias binários ou o operador um pouco se ele
| (A | B) vai dar 61, que é 0011 1101
existe em qualquer operando.
Binários cópias XOR operador a pouco se estiver
^ (A ^ B) vai dar 49, que é 0011 0001
definido em um operando, mas não ambos.
(~ A) dará -61, que é de 1100 0011 na
Os binários Complemento Operador é unário e
~ forma do complemento de 2 devido a
tem o efeito de bits 'lançando'.
um número binário assinado.
Binary Operador Shift esquerda. O valor do
<< operando à esquerda mover para a esquerda pelo Um << 2 dará 240, que é 1111 0000
número de bits especificado pelo operando direito.
Binary Operador Shift direita. O valor do
>> operando à esquerda é movido para a direita pelo A >> 2 vai dar 15, que é 0000 1111
número de bits especificado pelo operando direito.

Exemplo
Tente o seguinte exemplo para entender todos os operadores bit a bit disponíveis em linguagem de
programação Objective-C:
#import <Foundation/Foundation.h>

main()
{

unsigned int a = 60; /* 60 = 0011 1100 */


unsigned int b = 13; /* 13 = 0000 1101 */
int c = 0;

c = a & b; /* 12 = 0000 1100 */


NSLog(@"Line 1 - Value of c is %d\n", c );

c = a | b; /* 61 = 0011 1101 */
NSLog(@"Line 2 - Value of c is %d\n", c );

c = a ^ b; /* 49 = 0011 0001 */
NSLog(@"Line 3 - Value of c is %d\n", c );

c = ~a; /*-61 = 1100 0011 */


NSLog(@"Line 4 - Value of c is %d\n", c );

c = a << 2; /* 240 = 1111 0000 */

27 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
NSLog(@"Line 5 - Value of c is %d\n", c );

c = a >> 2; /* 15 = 0000 1111 */


NSLog(@"Line 6 - Value of c is %d\n", c );
}

Quando você compilar e executar o programa acima, produz o seguinte resultado:


2013-09-07 22:11:51.652 demo[30836] Line 1 - Value of c is 12
2013-09-07 22:11:51.652 demo[30836] Line 2 - Value of c is 61
2013-09-07 22:11:51.652 demo[30836] Line 3 - Value of c is 49
2013-09-07 22:11:51.652 demo[30836] Line 4 - Value of c is -61
2013-09-07 22:11:51.652 demo[30836] Line 5 - Value of c is 240
2013-09-07 22:11:51.652 demo[30836] Line 6 - Value of c is 15

Operador Descrição Exemplo


cópias binários e Operador um pouco para o resultado se (A & B) vai dar 12, que é 0000
&
ele existe em ambos os operadores. 1100
cópias binários ou o operador um pouco se ele existe em (A | B) vai dar 61, que é 0011
|
qualquer operando. 1101
Binários cópias XOR operador a pouco se estiver (A ^ B) vai dar 49, que é 0011
^
definido em um operando, mas não ambos. 0001
(~ A) dará -61, que é de 1100
Os binários Complemento Operador é unário e tem o
~ 0011 na forma do complemento
efeito de bits 'lançando'.
de 2.
Binary Operador Shift esquerda. O valor operandos
Um << 2 dará 240, que é 1111
<< esquerda mover para a esquerda pelo número de bits
0000
especificado pelo operando direito.
Binary Operador Shift direita. O valor operandos
A >> 2 vai dar 15, que é 0000
>> esquerda é movido para a direita pelo número de bits
1111
especificado pelo operando direito.

Operadores de atribuição
Existem as seguintes operadores de atribuição suportados pela linguagem Objective-C:
Existem as seguintes operadores de atribuição suportados pela linguagem Objective-C:

Operador Descrição Exemplo


Simples operador de atribuição, atribui valores de operandos C = A + B valor irá
=
lado direito para o lado esquerdo operando atribuir de A + B para C
Adicionar e operador de atribuição, Acrescenta operando direito
C + = A é equivalente a C
+= ao operando esquerdo e atribui o resultado ao operando
=C+A
esquerdo
-= Subtrair E operador de atribuição, ele subtrai operando desde o C - = A é equivalente a C

28 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
operando da esquerda e atribui o resultado ao operando
=C-A
esquerdo
Multiplicar e operador de atribuição, Ele multiplica operando
C * = A é equivalente a C
*= direito com o operando da esquerda e atribui o resultado ao
=C*A
operando esquerdo
Dividir e operador de atribuição, ele divide operando esquerdo
C / = A é equivalente a C
/= com o operando direito e atribui o resultado ao operando
=C/A
esquerdo
Módulo e atribuição operador, mas é preciso módulo usando C% = A é equivalente a
%=
dois operandos e atribui o resultado ao operando esquerdo C = C% A
C << = 2 é o mesmo que
<< = deslocamento para a esquerda e operador de atribuição
C = C << 2
C >> = 2 é o mesmo que
>> = deslocamento para a direita E operador de atribuição
C = C >> 2
C & = 2 é o mesmo que
&= Bit a bit E operador de atribuição
C=C&2
C ^ = 2 é o mesmo que C
=^ bit a bit OU exclusivo e operador de atribuição
=C^2
C | = 2 é o mesmo que C
|= bit a bit OU inclusivo e operador de atribuição
=C|2

Exemplo
Tente o seguinte exemplo para entender todos os operadores de atribuição disponíveis na linguagem de
programação Objective-C:
#import <Foundation/Foundation.h>

main()
{
int a = 21;
int c ;

c = a;
NSLog(@"Line 1 - = Operator Example, Value of c = %d\n", c );

c += a;
NSLog(@"Line 2 - += Operator Example, Value of c = %d\n", c );

c -= a;
NSLog(@"Line 3 - -= Operator Example, Value of c = %d\n", c );

c *= a;
NSLog(@"Line 4 - *= Operator Example, Value of c = %d\n", c );

c /= a;

29 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
NSLog(@"Line 5 - /= Operator Example, Value of c = %d\n", c );

c = 200;
c %= a;
NSLog(@"Line 6 - %= Operator Example, Value of c = %d\n", c );

c <<= 2;
NSLog(@"Line 7 - <<= Operator Example, Value of c = %d\n", c );

c >>= 2;
NSLog(@"Line 8 - >>= Operator Example, Value of c = %d\n", c );

c &= 2;
NSLog(@"Line 9 - &= Operator Example, Value of c = %d\n", c );

c ^= 2;
NSLog(@"Line 10 - ^= Operator Example, Value of c = %d\n", c );

c |= 2;
NSLog(@"Line 11 - |= Operator Example, Value of c = %d\n", c );

Quando você compilar e executar o programa acima, produz o seguinte resultado:


2013-09-07 22:00:19.263 demo[21858] Line 1 - = Operator Example, Value of c = 21
2013-09-07 22:00:19.263 demo[21858] Line 2 - += Operator Example, Value of c = 42
2013-09-07 22:00:19.263 demo[21858] Line 3 - -= Operator Example, Value of c = 21
2013-09-07 22:00:19.263 demo[21858] Line 4 - *= Operator Example, Value of c = 441
2013-09-07 22:00:19.263 demo[21858] Line 5 - /= Operator Example, Value of c = 21
2013-09-07 22:00:19.264 demo[21858] Line 6 - %= Operator Example, Value of c = 11
2013-09-07 22:00:19.264 demo[21858] Line 7 - <<= Operator Example, Value of c = 44
2013-09-07 22:00:19.264 demo[21858] Line 8 - >>= Operator Example, Value of c = 11
2013-09-07 22:00:19.264 demo[21858] Line 9 - &= Operator Example, Value of c = 2
2013-09-07 22:00:19.264 demo[21858] Line 10 - ^= Operator Example, Value of c = 0
2013-09-07 22:00:19.264 demo[21858] Line 11 - |= Operator Example, Value of c = 2

Operador Descrição Exemplo


Simples operador de atribuição, atribui valores de operandos C = A + B valor irá
=
lado direito para o lado esquerdo operando atribuir de A + B para C
Adicionar e operador de atribuição, Acrescenta operando direito
C + = A é equivalente a C
+= ao operando esquerdo e atribui o resultado ao operando
=C+A
esquerdo
Subtrair E operador de atribuição, ele subtrai operando desde o
C - = A é equivalente a C
-= operando da esquerda e atribui o resultado ao operando
=C-A
esquerdo
*= Multiplicar e operador de atribuição, Ele multiplica operando C * = A é equivalente a C

30 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
direito com o operando da esquerda e atribui o resultado ao
=C*A
operando esquerdo
Dividir e operador de atribuição, ele divide operando esquerdo
C / = A é equivalente a C
/= com o operando direito e atribui o resultado ao operando
=C/A
esquerdo
Módulo e atribuição operador, mas é preciso módulo usando C% = A é equivalente a
%=
dois operandos e atribui o resultado ao operando esquerdo C = C% A
C << = 2 é o mesmo que
<< = deslocamento para a esquerda e operador de atribuição
C = C << 2
C >> = 2 é o mesmo que
>> = deslocamento para a direita E operador de atribuição
C = C >> 2
C & = 2 é o mesmo que
&= Bit a bit E operador de atribuição
C=C&2
C ^ = 2 é o mesmo que C
=^ bit a bit OU exclusivo e operador de atribuição
=C^2
C | = 2 é o mesmo que C
|= bit a bit OU inclusivo e operador de atribuição
=C|2

Diversos operadores e mapa; sizeof & ternário


Há alguns outros operadores importantes, incluindo sizeof e? : Apoiado por Objective-C Idioma.
Há alguns outros operadores importantes, incluindo sizeof e? : Apoiado por Objective-C Idioma.

Operador Descrição Exemplo


Retorna o tamanho de uma
tamanho de() sizeof (a), onde a é interger, irá retornar 4.
variável.
Retorna o endereço de uma
& &uma; vai dar o endereço real da variável.
variável.
* Ponteiro para uma variável. *uma; vai ponteiro para uma variável.
Se a condição for verdadeira, então o valor X:? Caso
?: Expressão condicional
contrário, valorizar Y

Exemplo
Tente o seguinte exemplo para entender todos os operadores de diversos disponíveis em linguagem de
programação Objective-C:
#import <Foundation/Foundation.h>

main()
{
int a = 4;
short b;

31 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
double c;
int* ptr;

/* example of sizeof operator */


NSLog(@"Line 1 - Size of variable a = %d\n", sizeof(a) );
NSLog(@"Line 2 - Size of variable b = %d\n", sizeof(b) );
NSLog(@"Line 3 - Size of variable c= %d\n", sizeof(c) );

/* example of & and * operators */


ptr = &a; /* 'ptr' now contains the address of 'a'*/
NSLog(@"value of a is %d\n", a);
NSLog(@"*ptr is %d.\n", *ptr);

/* example of ternary operator */


a = 10;
b = (a == 1) ? 20: 30;
NSLog(@"Value of b is %d\n", b );

b = (a == 10) ? 20: 30;


NSLog(@"Value of b is %d\n", b );
}

Quando você compilar e executar o programa acima, produz o seguinte resultado:


2013-09-07 22:46:22.702 demo[24593] Line 1 - Size of variable a = 4
2013-09-07 22:46:22.703 demo[24593] Line 2 - Size of variable b = 2
2013-09-07 22:46:22.703 demo[24593] Line 3 - Size of variable c= 8
2013-09-07 22:46:22.703 demo[24593] value of a is 4
2013-09-07 22:46:22.703 demo[24593] *ptr is 4.
2013-09-07 22:46:22.703 demo[24593] Value of b is 30
2013-09-07 22:46:22.703 demo[24593] Value of b is 20

Operador Descrição Exemplo


Retorna o tamanho de uma
tamanho de() sizeof (a), onde a é inteiro, retornará 4.
variável.
Retorna o endereço de uma
& &uma; vai dar o endereço real da variável.
variável.
* Ponteiro para uma variável. *uma; vai ponteiro para uma variável.
Se a condição é verdadeira? Em seguida, o valor X: Caso
?: Expressão condicional
contrário valorizar Y

Operadores Precedência em Objective-C


A precedência do operador determina o agrupamento de termos em uma expressão. Isto afeta como
uma expressão é avaliada. Alguns operadores têm precedência maior do que os outros; por exemplo, o
operador de multiplicação tem precedência maior do que o operador de adição:

32 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
Por exemplo, X = 7 + 3 * 2; aqui, x é atribuído 13, não 20, porque operador * tem precedência maior
do que +, por isso primeiro lugar é multiplicado por 3 * 2 e, em seguida, adiciona a 7.
Aqui, os operadores com a prioridade mais alta aparecem na parte superior da tabela, aqueles com a
menor aparecem na parte inferior. Dentro de uma expressão, operadores de precedência maior será
avaliada primeiro.

Categoria Operador associatividade


Postfix () [] ->. ++ - - Da esquerda para direita
unário + -! ~ ++ - - (Tipo) * & sizeof Direita para esquerda
multiplicativo * /% Da esquerda para direita
Aditivo +- Da esquerda para direita
Mudança << >> Da esquerda para direita
relacional <<=>> = Da esquerda para direita
Igualdade ==! = Da esquerda para direita
XOR ^ Da esquerda para direita
OR bit a bit | Da esquerda para direita
E lógico && Da esquerda para direita
OU lógico || Da esquerda para direita
Condicional ?: Direita para esquerda
Tarefa = + = - = * = / =% = >> = << = & = ^ = | = Direita para esquerda
Vírgula , Da esquerda para direita

Objective-C Loops
Pode haver uma situação, quando você precisa para executar um bloco de código várias número de
vezes. Em geral, as instruções são executadas sequencialmente: A primeira demonstração de uma
função é executada primeiro, seguido por um segundo, e assim por diante.
As linguagens de programação fornecer várias estruturas de controle que permitem caminhos de
execução mais complicadas.
Uma declaração de loop nos permite executar uma instrução ou grupo de instruções várias vezes e que
se segue é a forma geral de uma declaração de loop na maioria das linguagens de programação:

33 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C

Objective-C linguagem de programação oferece os seguintes tipos de loop para lidar com requisitos de
looping. Clique nos links abaixo para verificar seus detalhes.

loop Tipo Descrição


Repete uma instrução ou grupo de instruções enquanto uma determinada condição é
while
verdadeira. Ele testa a condição antes de executar o corpo do loop.
Executar uma seqüência de instruções várias vezes e abrevia o código que gerencia a
loop
variável de loop.
fazer ... loop
Como uma indicação quando, excepto que testa a condição no final do corpo do ciclo.
while
loops Você pode usar um ou mais circuitos dentro de qualquer outro tempo, a favor ou
aninhados do..while loop.

Declarações de Controle de loop:


instruções de controle de loop alterar a execução de sua sequência normal. Quando a execução deixa
um escopo, todos os objetos automáticos que foram criados nesse âmbito são destruídos.
Objective-C suporta as seguintes instruções de controle. Clique nos links abaixo para verificar seus
detalhes.

Declaração de
Descrição
controle
instrução break Encerra o loop ou switch declaração e transfere a execução da instrução

34 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
imediatamente após o loop ou switch.
Faz com que o loop para ignorar o restante de seu corpo e imediatamente testar
instrução continue
novamente sua condição antes de reiterar.

The Infinite Loop:


Um ciclo se torna loop infinito se uma condição nunca se torna falsa. O laço é tradicionalmente
usado para este propósito. Uma vez que nenhum dos três expressões que formam o loop são
necessários, você pode fazer um loop infinito, deixando a expressão condicional vazio.
#import <Foundation/Foundation.h>

int main ()
{

for( ; ; )
{
NSLog(@"This loop will run forever.\n");
}

return 0;
}

Quando a expressão condicional está ausente, assume-se ser verdade. Você pode ter uma inicialização e
incrementar expressão, mas os programadores Objective-C mais comumente usar o for (;;) construir
para significar um loop infinito.

Objective-C Tomando uma decisão


estruturas de tomada de decisões exigem que o programador especificar uma ou mais condições a
serem avaliadas ou testados pelo programa, juntamente com uma declaração ou instruções a serem
executadas se a condição é determinada para ser verdade, e, opcionalmente, outras declarações a serem
executadas se a condição está determinado a ser falsa.
A seguir é a forma geral de uma típica estrutura de tomada de decisões encontrados na maioria das
linguagens de programação:

35 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C

Objective C-linguagem de programação assume quaisquer valores diferentes de zero e não nulos
como verdadeiros, e se ele é zero ou nulo, então é assumido como valor falso.
Objective-C linguagem de programação oferece os seguintes tipos de declarações tomada de decisão.
Clique nos links abaixo para verificar seus detalhes:

Declaração Descrição
Uma declaração se consiste de uma expressão booleana seguido por uma ou
if
mais declarações.
Uma instrução if pode ser seguida por uma instrução else opcional, que
if ... else
executa quando a expressão booleana é falsa.
aninhado if Você pode usar um if ou else if dentro de outro caso ou instrução else if (s).
A instrução switch permite que uma variável a ser testada para a igualdade
switch
contra uma lista de valores.
instruções switch Você pode usar uma instrução switch dentro de um outro comunicado (s)
aninhados switch.

O ? : Operador:
Nós cobrimos operador condicional? : No capítulo anterior, que pode ser usado para substituir
if ... else. Ele tem a seguinte forma geral:
Exp1 ? Exp2 : Exp3;

Onde Exp1, EXP2 e exp3 são expressões. Observe o uso e colocação do cólon.
O valor de A? expressão é determinado assim: Exp1 é avaliada. Se isso for verdadeiro, então EXP2 é
avaliada e torna-se o valor do inteiro? expressão. Se Exp1 é falsa, então exp3 é avaliada e seu valor
torna-se o valor da expressão.

36 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C

Objective-C Funções
Uma função é um grupo de instruções que juntos executam uma tarefa. Cada programa de Objective-C
tem uma função C, que émain (), e todos os programas mais triviais podem definir funções
adicionais.
Você pode dividir seu código em funções separadas. Como você dividir o seu código entre diferentes
funções é com você, mas logicamente a divisão geralmente é assim que cada função executa uma tarefa
específica.
Adeclaração de função informa o compilador sobre o nome de uma função, tipo de retorno e
parâmetros.Adefinição da função fornece o corpo real da função.
Basicamente em Objective-C, chamamos a função como método.
O quadro Objective-C fundação fornece vários métodos internos que seu programa pode chamar. Por
exemplo, o métodoappendString () para anexar string para outra string.
Um método é conhecido com vários nomes como uma função ou sub-rotina ou um procedimento, etc.

Definindo um Método
A forma geral de um método de definição de linguagem de programação Objective-C é como se segue:
- (return_type) method_name:( argumentType1 )argumentName1
joiningArgument2:( argumentType2 )argumentName2 ...
joiningArgumentn:( argumentTypen )argumentNamen
{
body of the function
}

A definição do método na linguagem de programação Objective-C consiste em umcabeçalho métodoe


umcorpodemétodo.Aqui são todas as partes de um método de:
• Tipo de retorno: Um método pode retornar um valor.Oreturn_type é o tipo de dados do
valor que a função retorna.Alguns métodos de realizar as operações desejadas sem retornar
um valor. Neste caso, o return_type é a palavra-chavevoid.
• Nome do método: Este é o nome real do método.O nome do método e da lista de parâmetros,
juntos, constituem a assinatura do método.
• Argumentos: Um argumento é como um espaço reservado.Quando uma função é chamada,
você passar um valor para o argumento. Este valor é referido como parâmetro real ou

37 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
argumento. A lista de parâmetros refere-se ao tipo, ordem e número de argumentos de um
método. Argumentos são opcionais; isto é, um método pode conter nenhum argumento.
• Juntando Argumento: Um argumento união é para torná-lo mais fácil de ler e de deixar
claro ao chamar-lo.
• Método Corpo: O corpo do método contém um conjunto de instruções que definem o que
o método faz.

Exemplo:
Segue-se o código-fonte para um método chamadomax ().Este método tem dois parâmetros num1 e
num2 e retorna o máximo entre os dois:
/* function returning the max between two numbers */
- (int) max:(int) num1 secondNumber:(int) num2
{
/* local variable declaration */
int result;

if (num1 > num2)


{
result = num1;
}
else
{
result = num2;
}

return result;
}

Declarações de método:
Adeclaração de método diz ao compilador sobre um nome de função e como chamar o método.O
corpo real da função pode ser definida separadamente.
A declaração de método tem as seguintes partes:
- (return_type) function_name:( argumentType1 )argumentName1
joiningArgument2:( argumentType2 )argumentName2 ...
joiningArgumentn:( argumentTypen )argumentNamen;

Para a função acima definido max (), que se segue é a declaração de método:
-(int) max:(int)num1 andNum2:(int)num2;

38 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
declaração de método é necessária quando você define um método em um arquivo de origem e você
chamar esse método em outro arquivo. Nesse caso, você deve declarar a função no topo do arquivo de
chamar a função.

Chamar um método:
Ao criar um método de Objective-C, você dá uma definição do que a função tem que fazer. Para usar
um método, você terá que chamar essa função para executar a tarefa definida.
Quando um programa chama uma função, o controlo do programa é transferido para o método
chamado. Um método chamado realiza definido tarefa, e quando a sua instrução de retorno é executado
ou quando a sua chave de fechamento fim função é atingido, ele retorna o controle do programa volta
para o programa principal.
Para chamar um método, você simplesmente precisa passar os parâmetros necessários, juntamente com
o nome do método, e se o método retorna um valor, então você pode armazenar o valor retornado. Por
exemplo:
#import <Foundation/Foundation.h>

@interface SampleClass:NSObject
/* method declaration */
- (int)max:(int)num1 andNum2:(int)num2;
@end

@implementation SampleClass

/* method returning the max between two numbers */


- (int)max:(int)num1 andNum2:(int)num2{
/* local variable declaration */
int result;

if (num1 > num2)


{
result = num1;
}
else
{
result = num2;
}

return result;
}

@end

int main ()
{
/* local variable definition */

39 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
int a = 100;
int b = 200;
int ret;

SampleClass *sampleClass = [[SampleClass alloc]init];

/* calling a method to get max value */


ret = [sampleClass max:a andNum2:b];

NSLog(@"Max value is : %d\n", ret );

return 0;
}

Eu mantive a função max (), juntamente com a função main () e cumprido o código-fonte. Durante a
execução executável final, que iria produzir o seguinte resultado:
2013-09-07 22:28:45.912 demo[26080] Max value is : 200

Argumentos da função:
Se uma função é usar argumentos, deve declarar variáveis que aceitam os valores dos argumentos.
Essas variáveis são chamados osparâmetros formais da função.
Os parâmetros formais se comportar como outras variáveis locais dentro da função e são criados a
partir da entrada para a função e destruídos ao sair.
Ao chamar uma função, há duas maneiras que os argumentos podem ser passados para uma função:

Tipo de
Descrição
chamada
Este método copia o valor real de um argumento para o parâmetro formal da função.
Chamada por
Neste caso, as alterações feitas para o parâmetro dentro da função não têm efeito sobre
valor
o argumento.
Este método copia o endereço de um argumento para o parâmetro formal. Dentro da
Chamada por
função, o endereço é usado para acessar o argumento real usado na chamada. Isso
referência
significa que as alterações feitas ao parâmetro afeta o argumento.

Por padrão, Objective-C usa achamada por valor para passar argumentos.Em geral, isso significa
que o código dentro de uma função não pode alterar os argumentos usados para chamar a função, e
acima mencionado exemplo ao chamar max () função usou o mesmo método.

40 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C

Objective-C blocos
Uma classe de Objective-C define um objeto que combina dados com o comportamento relacionado.
Às vezes, faz sentido apenas para representar uma única tarefa ou unidade de comportamento, ao invés
de uma coleção de métodos.
Os blocos são um recurso de nível de linguagem adicionados a C, Objective-C e C ++ que lhe
permitem criar segmentos distintos de código que podem ser passados em torno de métodos ou funções
como se fossem valores. Blocos são objetos Objective-C que significa que eles podem ser adicionados
a coleções como NSArray ou NSDictionary. Eles também têm a capacidade de capturar os valores do
âmbito envolvente, tornando-os semelhantes aos encerramentos ou lambdas em outras linguagens de
programação

sintaxe simples declaração Bloco


returntype (^blockName)(argumentType);

implementação simples bloco


returntype (^blockName)(argumentType)= ^{
};

Aqui está um exemplo simples


void (^simpleBlock)(void) = ^{
NSLog(@"This is a block");
};

Podemos invocar o bloco usando


simpleBlock();

Blocos levam argumentos e valores de retorno


Os blocos também podem ter argumentos e valores de retorno, assim como métodos e funções.
Aqui está um exemplo simples de implementar e invocar um bloco com argumentos e valores de
retorno.
double (^multiplyTwoValues)(double, double) =
^(double firstValue, double secondValue) {

41 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
return firstValue * secondValue;
};
double result = multiplyTwoValues(2,4);
NSLog(@"The result is %f", result);

Blocos usando definições de tipo


Aqui está um exemplo simples usando typedef no bloco. Por favor note que este exemplo não
funciona no compilador on-line para agora. Use XCode para executar o mesmo.
#import <Foundation/Foundation.h>

typedef void (^CompletionBlock)();


@interface SampleClass:NSObject
- (void)performActionWithCompletion:(CompletionBlock)completionBlock;
@end

@implementation SampleClass

- (void)performActionWithCompletion:(CompletionBlock)completionBlock{

NSLog(@"Action Performed");
completionBlock();
}

@end

int main()
{
/* my first program in Objective-C */
SampleClass *sampleClass = [[SampleClass alloc]init];
[sampleClass performActionWithCompletion:^{
NSLog(@"Completion is called to intimate action is performed.");
}];

return 0;
}

Vamos compilar e executá-lo, que irá produzir o seguinte resultado:


2013-09-10 08:13:57.155 demo[284:303] Action Performed
2013-09-10 08:13:57.157 demo[284:303] Completion is called to intimate action is
performed.

Blocos são mais utilizados em aplicações iOS e Mac OS X. Portanto, a sua mais importante para
entender o uso de blocos.

42 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C

Objective-C Números
Em linguagem de programação Objective-C, a fim de salvar os tipos de dados básicos, como int, float,
bool em forma de objeto,
Objective-C fornece uma variedade de métodos para trabalhar com NSNumber e mais importantes
estão listados na tabela seguinte.

SN Método e Descrição
+ (NSNumber *) numberWithBool: Valor (BOOL) Cria e retorna um objeto NSNumber
1 contendo um determinado valor, tratando-o como um BOOL.

+ (NSNumber *) numberWithChar: Valor (char) Cria e retorna um objeto NSNumber


2 contendo um determinado valor, tratando-o como um char assinado.

+ (NSNumber *) numberWithDouble: Valor (duplo) Cria e retorna um objeto NSNumber


3 contendo um determinado valor, tratando-o como um casal.

+ (NSNumber *) numberWithFloat: valor (float) Cria e retorna um objeto NSNumber


4 contendo um determinado valor, tratando-o como um float.

+ (NSNumber *) numberWithInt: valor (int) Cria e devolve um objecto NSNumber contendo


5 um determinado valor, tratando-a como um inteiro assinado.

+ (NSNumber *) numberWithInteger: Valor (NSInteger) Cria e retorna um objeto NSNumber


6 contendo um determinado valor, tratando-o como um NSInteger.

- (BOOL) boolValue Retorna o valor do receptor como um BOOL.


7
- (Char) charValue Retorna o valor do receptor como um char.
8
- (Double) doubleValue Retorna o valor do receptor como um casal.
9
- (Float) floatValue Retorna o valor do receptor como um float.
10
- (NSInteger) integerValue Retorna o valor do receptor como um NSInteger.
11
- (Int) intValue Retorna o valor do receptor como um int.
12

43 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
- (NSString *) stringValue Retorna o valor do receptor como uma string legível.
13
Aqui está um exemplo simples para usar NSNumber que multiplica dois números e retorna o produto.
#import <Foundation/Foundation.h>

@interface SampleClass:NSObject

- (NSNumber *)multiplyA:(NSNumber *)a withB:(NSNumber *)b;

@end

@implementation SampleClass

- (NSNumber *)multiplyA:(NSNumber *)a withB:(NSNumber *)b


{
float number1 = [a floatValue];
float number2 = [b floatValue];
float product = number1 * number2;
NSNumber *result = [NSNumber numberWithFloat:product];
return result;
}

@end

int main()
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

SampleClass *sampleClass = [[SampleClass alloc]init];


NSNumber *a = [NSNumber numberWithFloat:10.5];
NSNumber *b = [NSNumber numberWithFloat:10.0];
NSNumber *result = [sampleClass multiplyA:a withB:b];
NSString *resultString = [result stringValue];
NSLog(@"The product is %@",resultString);

[pool drain];
return 0;
}

Agora, quando compilar e executar o programa, iremos obter o seguinte resultado.


2013-09-14 18:53:40.575 demo[16787] The product is 105

Objective-C Arrays
A linguagem de programação Objective C fornece uma estrutura de dados chamadaa matriz, que pode
armazenar um de tamanho fixo recolha sequencial de elementos do mesmo tipo. Uma matriz é

44 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
utilizada para armazenar um conjunto de dados, mas é muitas vezes mais útil pensar de uma matriz
como um conjunto de variáveis do mesmo tipo.
Em vez de declarar variáveis individuais, como number0, number1, ..., e number99, você declarar uma
variável de matriz, tais como números e números de uso [0], números de [1], e ..., números [99] para
representar variáveis individuais. Um elemento específico em uma matriz é acessada por um índice.
Todas as matrizes consistem em localizações contíguas de memória. O endereço mais baixo
corresponde ao primeiro elemento e o maior endereço para o último elemento.

declarando Arrays
Para declarar uma matriz em Objective-C, um programador especifica o tipo de elementos e o número
de elementos necessários por uma matriz como se segue:
type arrayName [ arraySize ];

Isto é chamado uma matrizunidimensional. O ArraySize deve ser um inteiro constante maior que
zero e tipo pode ser qualquer tipo de dados Objective-C válido. Por exemplo, para declarar uma
matriz de 10 elementos chamado equilíbrio do tipo double, use a seguinte declaração:
double balance[10];

Agora, o equilíbrio é uma matriz variável, que é suficiente para armazenar até 10 números de duplas.

Inicializando Arrays
Você pode inicializar uma matriz em Objective-C, quer um por um ou usando uma única instrução da
seguinte forma:
double balance[5] = {1000.0, 2.0, 3.4, 17.0, 50.0};

O número de valores entre chaves {} não pode ser maior do que o número de elementos que declaram
para a matriz entre colchetes []. A seguir é um exemplo para atribuir um único elemento da matriz:
Se você omitir o tamanho da matriz, uma matriz grande o suficiente apenas para manter a inicialização
é criado. Portanto, se você escrever:

45 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
double balance[] = {1000.0, 2.0, 3.4, 17.0, 50.0};

Você vai criar exatamente a mesma matriz como fez no exemplo anterior.
balance[4] = 50.0;

A declaração acima atribui elemento número 5ª na matriz um valor de 50,0. Array com 4 índice será dia
5, ou seja, último elemento, porque todas as matrizes tem 0 como o índice do primeiro elemento que
também é chamado de índice de base. A seguir é a representação pictórica da mesma matriz discutimos
acima:

Acessando elementos de matriz


Um elemento é acessado por indexar o nome da matriz. Isto é feito colocando o índice do elemento
dentro de parêntesis rectos após o nome da matriz. Por exemplo:
double salary = balance[9];

A declaração acima levará 10th elemento da matriz e atribuir o valor a variável salário. Este é um
exemplo, que usará todos os acima mencionados três conceitos viz. declaração, de atribuição e acesso a
matrizes:
#import <Foundation/Foundation.h>

int main ()
{
int n[ 10 ]; /* n is an array of 10 integers */
int i,j;

/* initialize elements of array n to 0 */


for ( i = 0; i < 10; i++ )
{
n[ i ] = i + 100; /* set element at location i to i + 100 */
}

/* output each array element's value */


for (j = 0; j < 10; j++ )
{
NSLog(@"Element[%d] = %d\n", j, n[j] );
}

return 0;
}

46 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
Quando o código acima é compilado e executado, ele produz o seguinte resultado:
2013-09-14 01:24:06.669 demo[16508] Element[0] = 100
2013-09-14 01:24:06.669 demo[16508] Element[1] = 101
2013-09-14 01:24:06.669 demo[16508] Element[2] = 102
2013-09-14 01:24:06.669 demo[16508] Element[3] = 103
2013-09-14 01:24:06.669 demo[16508] Element[4] = 104
2013-09-14 01:24:06.669 demo[16508] Element[5] = 105
2013-09-14 01:24:06.669 demo[16508] Element[6] = 106
2013-09-14 01:24:06.669 demo[16508] Element[7] = 107
2013-09-14 01:24:06.669 demo[16508] Element[8] = 108
2013-09-14 01:24:06.669 demo[16508] Element[9] = 109

Arrays Objective-C em Detalhe


Arrays são importantes para Objective-C e precisa de muito mais detalhes. Há seguindo alguns
conceitos importantes relacionados com a matriz que deve ser claro para um programador Objective-C:

Conceito Descrição
Arrays multi- Objective-C suporta arrays multidimensionais. A forma mais simples da
dimensionais matriz multidimensional é a matriz bidimensional.
Passando matrizes para Você pode passar para a função um ponteiro para uma matriz especificando
funções o nome do array sem um índice.
Voltar matriz de uma
Objective-C permite que uma função para retornar um array.
função
É possível gerar um ponteiro para o primeiro elemento de uma matriz,
Ponteiro para uma matriz
simplesmente especificando o nome da matriz, sem qualquer índice.

Objective-C ponteiros
Os ponteiros em Objective-C é fácil e divertida de aprender. Algumas tarefas de programação
Objective-C são realizados mais facilmente com ponteiros e outras tarefas, tais como a alocação
dinâmica de memória, não pode ser realizada sem o uso de ponteiros. Assim torna-se necessário
aprender ponteiros para se tornar um perfeito programador Objective-C. Vamos começar a aprender los
em passos simples e fácil.
Como você sabe, cada variável é um local de memória e cada local de memória tem o seu endereço
definido que pode ser acessado utilizando operador e comercial (&), o que denota um endereço na
memória. Considere o exemplo a seguir, que irá imprimir o endereço das variáveis definidas:

47 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
#import <Foundation/Foundation.h>

int main ()
{
int var1;
char var2[10];

NSLog(@"Address of var1 variable: %x\n", &var1 );


NSLog(@"Address of var2 variable: %x\n", &var2 );

return 0;
}

Quando o código acima é compilado e executado, ele produz o resultado algo como se segue:
2013-09-13 03:18:45.727 demo[17552] Address of var1 variable: 1c0843fc
2013-09-13 03:18:45.728 demo[17552] Address of var2 variable: 1c0843f0

Então, você entendeu o que é o endereço de memória e como acessá-lo, de modo base do conceito é
longo. Agora vamos ver o que é um ponteiro.

O que são ponteiros?


Um ponteiro é uma variável cujo valor é o endereço de outra variável, ou seja, endereço direto da
posição de memória. Como qualquer variável ou constante, você deve declarar um ponteiro antes que
você possa usá-lo para armazenar qualquer endereço variável. A forma geral de uma declaração de
variável ponteiro é:
type *var-name;

Aqui, tipo é o tipo base do ponteiro; ele deve ser um tipo de dados Objective-C válido e var-name é
o nome da variável ponteiro. O asterisco * você usou para declarar um ponteiro é o mesmo asterisco
que você usa para multiplicação. No entanto, neste documento o asterisco está a ser utilizado para
designar uma variável como um apontador. Seguem-se a declaração ponteiro válido:
int *ip; /* pointer to an integer */
double *dp; /* pointer to a double */
float *fp; /* pointer to a float */
char *ch /* pointer to a character */

O tipo de dados real do valor de todos os ponteiros, seja inteiro, ponto flutuante, caracteres, ou de outra
forma, é o mesmo, um número hexadecimal longo que representa um endereço de memória. A única
diferença entre ponteiros de diferentes tipos de dados é o tipo de dados da variável ou constante que o
ponteiro aponta para.

48 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
Como usar ponteiros?
Há poucas operações importantes, que vamos fazer com a ajuda de ponteiros com muita freqüência.
(A) definimos uma variável ponteiro, (b) atribuir o endereço de uma variável para um ponteiro, e
(c) finalmente, acessar o valor no endereço disponível na variável ponteiro. Isto é feito através da
utilização unária operador * que devolve o valor da variável localizado no endereço especificado
pelo seu operando. Seguindo o exemplo faz uso destas operações:
#import <Foundation/Foundation.h>

int main ()
{
int var = 20; /* actual variable declaration */
int *ip; /* pointer variable declaration */

ip = &var; /* store address of var in pointer variable*/

NSLog(@"Address of var variable: %x\n", &var );

/* address stored in pointer variable */


NSLog(@"Address stored in ip variable: %x\n", ip );

/* access the value using the pointer */


NSLog(@"Value of *ip variable: %d\n", *ip );

return 0;
}

Quando o código acima é compilado e executado, ele produz o resultado algo como se segue:
2013-09-13 03:20:21.873 demo[24179] Address of var variable: 337ed41c
2013-09-13 03:20:21.873 demo[24179] Address stored in ip variable: 337ed41c
2013-09-13 03:20:21.874 demo[24179] Value of *ip variable: 20

Ponteiros nulos em Objective-C


É sempre uma boa prática para atribuir um valor NULL a uma variável ponteiro no caso de você não
tem endereço exato a ser atribuído. Isto é feito no momento da declaração variável. Um ponteiro que é
atribuído NULL é chamado um ponteiro nulo.
O ponteiro nulo é uma constante com um valor de zero definida de várias bibliotecas padrão. Considere
o seguinte programa:
#import <Foundation/Foundation.h>

int main ()
{
int *ptr = NULL;

49 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C

NSLog(@"The value of ptr is : %x\n", ptr );

return 0;
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado:


2013-09-13 03:21:19.447 demo[28027] The value of ptr is : 0

Na maioria dos sistemas operacionais, programas não têm permissão para acessar a memória no
endereço 0, porque essa memória é reservada pelo sistema operacional. No entanto, o endereço de
memória 0 tem um significado especial; sinaliza que o ponteiro não se destina a indicar um local de
memória acessível. Mas, por convenção, se um ponteiro contém o valor nulo (zero), é assumido que
apontam para nada.
Para verificar se um ponteiro nulo, você pode usar um se instrução da seguinte forma:
if(ptr) /* succeeds if p is not null */
if(!ptr) /* succeeds if p is null */

Objective-C ponteiros em Detalhe:


Os ponteiros têm muitas, mas fáceis conceitos e eles são muito importantes para a programação
Objective-C. Há seguindo alguns conceitos importantes de ponteiro, que deve ser claro para um
programador Objective-C:

Conceito Descrição
Objective-C - ponteiro Há quatro operações aritméticas que pode ser usado em ponteiros: ++, -,
aritmética +, -
Objective-C - matriz de
Você pode definir matrizes para realizar uma série de ponteiros.
ponteiros
Objective-C - ponteiro para Objective-C permite que você tenha ponteiro sobre um ponteiro e assim
ponteiro por diante.
Passar um argumento por referência ou por endereço de ambos permitem
Passando ponteiros para
o argumento passou a ser mudado na função de chamada pela função
funções em Objective-C
chamada.
Retornar ponteiro de Objective-C permite que uma função para retornar um ponteiro para
funções em Objective-C variável local, variável estática e memória alocada dinamicamente bem.

50 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C

Objective-C Strings
A cadeia de caracteres em linguagem de programação Objective-C é representado usando NSString e
sua NSMutableString subclasse oferece várias maneiras para a criação de objetos de cadeia. A maneira
mais simples para criar um objeto string é usar o Objective-C @ "..." construir:
NSString *greeting = @"Hello";

Um exemplo simples para criar e imprimir uma string é mostrado abaixo.


#import <Foundation/Foundation.h>

int main ()
{
NSString *greeting = @"Hello";

NSLog(@"Greeting message: %@\n", greeting );

return 0;
}

Quando o código acima é compilado e executado, ele produz resultar algo como se segue:
2013-09-11 01:21:39.922 demo[23926] Greeting message: Hello

Objective-C suporta uma ampla gama de métodos para manipular strings:

SN Method & Purpose


- (NSString *) capitalizedString; Retorna uma representação capitalizado do receptor.
1
- (UNICHAR) characterAtIndex: índice (NSUInteger); Retorna o caractere em uma
2 determinada posição matriz.

- (Double) doubleValue; Retorna o valor de ponto flutuante do texto do receptor como um casal.
3
- (Float) floatValue; Retorna o valor de ponto flutuante do texto do receptor como um float.
4
- (BOOL) hasPrefix: (NSString *) aString; Retorna um valor booleano que indica se uma
5 determinada cadeia coincide com os caracteres iniciais do receptor.

- (BOOL) hasSuffix: (NSString *) aString; Retorna um valor booleano que indica se uma
6 determinada cadeia coincide com os caracteres de final do receptor.

51 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
- (Id) initWithFormat: Formato (NSString *) ...; Retorna um objeto NSString inicializado
usando uma seqüência de formato dado como um modelo no qual os valores dos argumentos
7
restantes são substituídos.

- (NSInteger) integerValue; Retorna o valor NSInteger do texto do receptor.


8
- (BOOL) isEqualToString: (NSString *) aString; Retorna um valor booleano que indica se
uma determinada string é igual ao receptor utilizando uma comparação literal com base em
9
Unicode.

- (NSUInteger) de comprimento; Retorna o número de caracteres Unicode no receptor.


10
- (NSString *) lowercaseString; Retorna em minúscula representação do receptor.
11
- (NSRange) rangeOfString: (NSString *) umaString; Localiza e retorna o intervalo da
12 primeira ocorrência de uma determinada cadeia dentro do receptor.

- (NSString *) stringByAppendingFormat: Formato (NSString *) ...; Retorna uma corda feita


anexando ao receptor uma corda construído a partir de uma determinada cadeia de formato e os
13
seguintes argumentos.

- (NSString *) stringByTrimmingCharactersInSet: (NSCharacterSet *) Conjunto; Retorna


uma nova corda feita através da remoção de ambas as extremidades dos personagens receptor
14
contidos em um determinado conjunto de caracteres.

- (NSString *) substringFromIndex: (NSUInteger) anIndex; Retorna uma nova seqüência de


15 caracteres contendo os caracteres do receptor da que estava em um determinado índice até o fim.

Seguindo o exemplo faz uso de algumas das funções acima mencionadas:


#import <Foundation/Foundation.h>

int main ()
{
NSString *str1 = @"Hello";
NSString *str2 = @"World";
NSString *str3;
int len ;

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

/* uppercase string */
str3 = [str2 uppercaseString];
NSLog(@"Uppercase String : %@\n", str3 );

52 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
/* concatenates str1 and str2 */
str3 = [str1 stringByAppendingFormat:@"World"];
NSLog(@"Concatenated string: %@\n", str3 );

/* total length of str3 after concatenation */


len = [str3 length];
NSLog(@"Length of Str3 : %d\n", len );

/* InitWithFormat */
str3 = [[NSString alloc] initWithFormat:@"%@ %@",str1,str2];
NSLog(@"Using initWithFormat: %@\n", str3 );
[pool drain];

return 0;
}

Quando o código acima é compilado e executado, ele produz resultar algo como se segue:
2013-09-11 01:15:45.069 demo[30378] Uppercase String : WORLD
2013-09-11 01:15:45.070 demo[30378] Concatenated string: HelloWorld
2013-09-11 01:15:45.070 demo[30378] Length of Str3 : 10
2013-09-11 01:15:45.070 demo[30378] Using initWithFormat: Hello World

Você pode encontrar uma lista completa dos métodos relacionados Objective-C NSString em NSString
Classe Reference.

Objective-C estruturas
Matrizes Objective-C permitem que você defina o tipo de variáveis que podem conter vários itens de
dados do mesmo tipo, mas a estrutura é um outro tipo de dados definidos pelo usuário disponíveis
na programação Objective-C, que permite combinar itens de dados de diferentes tipos.
Estruturas são usados para representar um recorde, Suponha que você queira manter o controle de seus
livros em uma biblioteca. Você pode querer controlar os seguintes atributos sobre cada livro:
• Título
• Autor
• Sujeito
• book ID

53 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
A definição de uma Estrutura
Para definir uma estrutura, você deve usar a declaração struct. A declaração struct define um novo tipo
de dados, com mais de um membro para o seu programa. O formato da declaração struct é esta:
struct [structure tag]
{
member definition;
member definition;
...
member definition;
} [one or more structure variables];

A tag estrutura é opcional e cada definição de membro é uma definição de variável normal, tais
como int i; ou flutuar f; ou qualquer outra definição de variável válido. No final da definição da
estrutura, antes do ponto e vírgula final, você pode especificar uma ou mais variáveis de estrutura, mas
é opcional. Aqui é a maneira que você declarar a estrutura do livro:
struct Books
{
NSString *title;
NSString *author;
NSString *subject;
int book_id;
} book;

Acessando membros de estrutura


Para aceder a qualquer membro de uma estrutura, usamos o operador de acesso de membro (.). O
operador de acesso de membro é codificado como um período entre o nome da variável estrutura e o
membro da estrutura que deseja acessar. Você usaria palavra-chave struct para definir variáveis do
tipo estrutura. Segue-se o exemplo para explicar o uso da estrutura:
#import <Foundation/Foundation.h>

struct Books
{
NSString *title;
NSString *author;
NSString *subject;
int book_id;
};

int main( )
{
struct Books Book1; /* Declare Book1 of type Book */
struct Books Book2; /* Declare Book2 of type Book */

54 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
/* book 1 specification */
Book1.title = @"Objective-C Programming";
Book1.author = @"Nuha Ali";
Book1.subject = @"Objective-C Programming Tutorial";
Book1.book_id = 6495407;

/* book 2 specification */
Book2.title = @"Telecom Billing";
Book2.author = @"Zara Ali";
Book2.subject = @"Telecom Billing Tutorial";
Book2.book_id = 6495700;

/* print Book1 info */


NSLog(@"Book 1 title : %@\n", Book1.title);
NSLog(@"Book 1 author : %@\n", Book1.author);
NSLog(@"Book 1 subject : %@\n", Book1.subject);
NSLog(@"Book 1 book_id : %d\n", Book1.book_id);

/* print Book2 info */


NSLog(@"Book 2 title : %@\n", Book2.title);
NSLog(@"Book 2 author : %@\n", Book2.author);
NSLog(@"Book 2 subject : %@\n", Book2.subject);
NSLog(@"Book 2 book_id : %d\n", Book2.book_id);

return 0;
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado:


2013-09-14 04:20:07.947 demo[20591] Book 1 title : Objective-C Programming
2013-09-14 04:20:07.947 demo[20591] Book 1 author : Nuha Ali
2013-09-14 04:20:07.947 demo[20591] Book 1 subject : Objective-C Programming
Tutorial
2013-09-14 04:20:07.947 demo[20591] Book 1 book_id : 6495407
2013-09-14 04:20:07.947 demo[20591] Book 2 title : Telecom Billing
2013-09-14 04:20:07.947 demo[20591] Book 2 author : Zara Ali
2013-09-14 04:20:07.947 demo[20591] Book 2 subject : Telecom Billing Tutorial
2013-09-14 04:20:07.947 demo[20591] Book 2 book_id : 6495700

Estruturas como argumentos da função


Você pode passar uma estrutura como um argumento de função de maneira muito semelhante como
você passar qualquer outra variável ou ponteiro. Você poderia acessar variáveis de estrutura na maneira
semelhante como você ter acessado no exemplo acima:
#import <Foundation/Foundation.h>

struct Books
{
NSString *title;
NSString *author;

55 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
NSString *subject;
int book_id;
};

@interface SampleClass:NSObject

/* function declaration */
- (void) printBook:( struct Books) book ;

@end

@implementation SampleClass

- (void) printBook:( struct Books) book


{
NSLog(@"Book title : %@\n", book.title);
NSLog(@"Book author : %@\n", book.author);
NSLog(@"Book subject : %@\n", book.subject);
NSLog(@"Book book_id : %d\n", book.book_id);
}
@end

int main( )
{
struct Books Book1; /* Declare Book1 of type Book */
struct Books Book2; /* Declare Book2 of type Book */

/* book 1 specification */
Book1.title = @"Objective-C Programming";
Book1.author = @"Nuha Ali";
Book1.subject = @"Objective-C Programming Tutorial";
Book1.book_id = 6495407;

/* book 2 specification */
Book2.title = @"Telecom Billing";
Book2.author = @"Zara Ali";
Book2.subject = @"Telecom Billing Tutorial";
Book2.book_id = 6495700;

SampleClass *sampleClass = [[SampleClass alloc]init];


/* print Book1 info */
[sampleClass printBook: Book1];

/* Print Book2 info */


[sampleClass printBook: Book2];

return 0;
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado:


2013-09-14 04:34:45.725 demo[8060] Book title : Objective-C Programming

56 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
2013-09-14 04:34:45.725 demo[8060] Book author : Nuha Ali
2013-09-14 04:34:45.725 demo[8060] Book subject : Objective-C Programming Tutorial
2013-09-14 04:34:45.725 demo[8060] Book book_id : 6495407
2013-09-14 04:34:45.725 demo[8060] Book title : Telecom Billing
2013-09-14 04:34:45.725 demo[8060] Book author : Zara Ali
2013-09-14 04:34:45.725 demo[8060] Book subject : Telecom Billing Tutorial
2013-09-14 04:34:45.725 demo[8060] Book book_id : 6495700

Ponteiros para estruturas


Você pode definir ponteiros para estruturas de forma muito semelhante como você define ponteiro para
qualquer outra variável da seguinte maneira:
struct Books *struct_pointer;

Agora, você pode armazenar o endereço de uma variável de estrutura na variável ponteiro acima
definido. Para encontrar o endereço de uma variável de estrutura, coloque o operador & antes do nome
da estrutura da seguinte maneira:
struct_pointer = &Book1;

Para acessar os membros de uma estrutura usando um ponteiro para essa estrutura, você deve usar o
operador -> como segue:
struct_pointer->title;

Vamos re-escrever exemplo acima usando ponteiro estrutura, espero que isso vai ser fácil para você
entender o conceito:
#import <Foundation/Foundation.h>

struct Books
{
NSString *title;
NSString *author;
NSString *subject;
int book_id;
};

@interface SampleClass:NSObject

/* function declaration */
- (void) printBook:( struct Books *) book ;

@end

@implementation SampleClass

- (void) printBook:( struct Books *) book

57 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
{
NSLog(@"Book title : %@\n", book->title);
NSLog(@"Book author : %@\n", book->author);
NSLog(@"Book subject : %@\n", book->subject);
NSLog(@"Book book_id : %d\n", book->book_id);
}
@end

int main( )
{
struct Books Book1; /* Declare Book1 of type Book */
struct Books Book2; /* Declare Book2 of type Book */

/* book 1 specification */
Book1.title = @"Objective-C Programming";
Book1.author = @"Nuha Ali";
Book1.subject = @"Objective-C Programming Tutorial";
Book1.book_id = 6495407;

/* book 2 specification */
Book2.title = @"Telecom Billing";
Book2.author = @"Zara Ali";
Book2.subject = @"Telecom Billing Tutorial";
Book2.book_id = 6495700;

SampleClass *sampleClass = [[SampleClass alloc]init];


/* print Book1 info by passing address of Book1 */
[sampleClass printBook:&Book1];

/* print Book2 info by passing address of Book2 */


[sampleClass printBook:&Book2];

return 0;
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado:


2013-09-14 04:38:13.942 demo[20745] Book title : Objective-C Programming
2013-09-14 04:38:13.942 demo[20745] Book author : Nuha Ali
2013-09-14 04:38:13.942 demo[20745] Book subject : Objective-C Programming Tutorial
2013-09-14 04:38:13.942 demo[20745] Book book_id : 6495407
2013-09-14 04:38:13.942 demo[20745] Book title : Telecom Billing
2013-09-14 04:38:13.942 demo[20745] Book author : Zara Ali
2013-09-14 04:38:13.942 demo[20745] Book subject : Telecom Billing Tutorial
2013-09-14 04:38:13.942 demo[20745] Book book_id : 6495700

Campos de bits
Campos de bits permitem que a embalagem de dados numa estrutura. Isto é especialmente útil quando
a memória ou o armazenamento de dados é um prémio. Exemplos típicos:

58 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
• Embalagem vários objetos em uma palavra máquina. por exemplo, as bandeiras de 1 bit pode
ser compactada.
• Leitura formatos de arquivos externos - formatos de arquivo não-padrão pode ser lido no Eg 9
bit inteiros..
Objective-C permite-nos fazer isso em uma definição de estrutura, colocando: comprimento de bits
após a variável. Por exemplo:
struct packed_struct {
unsigned int f1:1;
unsigned int f2:1;
unsigned int f3:1;
unsigned int f4:1;
unsigned int type:4;
unsigned int my_int:9;
} pack;

Aqui, o packed_struct contém 6 membros: Quatro bandeiras 1 bit f1..f3, um tipo de 4 bits e um my_int
9 bit.
Objectivo-C embala automaticamente os campos de bits acima de forma tão compacta quanto possível,
desde que o comprimento máximo do campo é menor do que ou igual à palavra inteiro comprimento do
computador. Se este não for o caso, em seguida, alguns compiladores podem permitir sobreposição de
memória para os campos, enquanto outro iria armazenar o campo seguinte da palavra seguinte.

Objective-C preprocessors
O pré-processador Objective-C não faz parte do compilador, mas é um passo separado no
processo de compilação. Em termos simplistas, um Objective-C pré-processador é apenas uma
ferramenta de substituição de texto e instrui o compilador para fazer pré-processamento exigido antes
da compilação real. Iremos nos referir ao Objective-C pré-processador como o OCPP.
Todos os comandos de pré-processamento começa com o símbolo sustenido (#). Deve ser o primeiro
caractere não vazia, e para facilitar a leitura, uma directiva de pré-processador deve começar na
primeira coluna. Seção seguinte lista para baixo todas as directivas de pré-processador importantes:

Directiva Descrição
#definir Substitui uma macro pré-processador
#incluir Insere um cabeçalho especial de outro arquivo
#undef Undefines uma macro pré-processador

59 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
#ifdef Retorna true se o macro é definida
#ifndef Retorna true se esta macro não está definida
#E se Testa se uma condição de tempo de compilação é verdade
#outro A alternativa para #if
#elif #else um #if em uma instrução
#fim se Termina pré-processamento condicional
#erro mensagem de erro é impressa em stderr
#pragma Emite comandos especiais para o compilador usando um método padronizado

preprocessors Exemplos
Analisar os seguintes exemplos para entender várias directivas.
#define MAX_ARRAY_LENGTH 20

Esta directiva diz ao OCPP para substituir ocorrências de MAX_ARRAY_LENGTH com 20.
Use#definepara constantes para aumentar a legibilidade.
#import <Foundation/Foundation.h>
#include "myheader.h"

Estas directivas dizer a OCPP para obter foundation.h partirFramework Foundation e adicione o
texto para o arquivo de origem atual.A próxima linha diz OCPP para obtermyheader.h do diretório
local e adicionar o conteúdo para o arquivo de origem atual.
#undef FILE_SIZE
#define FILE_SIZE 42

Isso diz ao OCPP indefinir FILE_SIZE existente e defini-la como 42.


#ifndef MESSAGE
#define MESSAGE "You wish!"
#endif

Isso diz ao OCPP para definir mensagem somente se a mensagem não estiver definido.
#ifdef DEBUG
/* Your debugging statements here */
#endif

Isso diz ao OCPP para fazer o processo das declarações anexas se DEBUG está definido. Isso é útil se
você passar o sinalizador-DDEBUGpara compilador gcc no momento da compilação. Isto irá definir
DEBUG, que você pode transformar a depuração dentro e fora na mosca durante a compilação.

60 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
macros predefinidas
ANSI C define uma série de macros. Embora cada um está disponível para seu uso na programação, as
macros pré-definidas não devem ser modificadas diretamente.

macro Descrição
__ENCONTRO__ A data atual como um caractere literal em "MMM DD aaaa"
__TEMPO__ A hora atual como um caractere literal em "HH: SS: MM" format
__ARQUIVO__ Este contém o nome do arquivo atual como uma string literal.
__LINHA__ Este contém o número da linha atual como uma constante decimal.
__STDC__ Definido como 1 quando o compilador está em conformidade com a norma ANSI.
Vamos tentar o seguinte exemplo:
#import <Foundation/Foundation.h>

int main()
{
NSLog(@"File :%s\n", __FILE__ );
NSLog(@"Date :%s\n", __DATE__ );
NSLog(@"Time :%s\n", __TIME__ );
NSLog(@"Line :%d\n", __LINE__ );
NSLog(@"ANSI :%d\n", __STDC__ );

return 0;
}

Quando o código acima em ummain.m arquivo é compilado e executado, produz o seguinte


resultado:
2013-09-14 04:46:14.859 demo[20683] File :main.m
2013-09-14 04:46:14.859 demo[20683] Date :Sep 14 2013
2013-09-14 04:46:14.859 demo[20683] Time :04:46:14
2013-09-14 04:46:14.859 demo[20683] Line :8
2013-09-14 04:46:14.859 demo[20683] ANSI :1

Operadores de pré-processamento
O pré-processador Objective-C oferece os seguintes operadores para ajudá-lo na criação de macros:

Continuação Macro (\)


A macro geralmente deve estar contido em uma única linha. O operador continuação macro é usado
para continuar uma macro que é demasiado longo para uma única linha. Por exemplo:
#define message_for(a, b) \
NSLog(@#a " and " #b ": We love you!\n")

61 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
Stringize (#)
O operador stringize ou um número de sinal ( '#'), quando usado em uma definição de macro, converte
um parâmetro macro em uma string constante. Este operador só pode ser utilizado em uma macro que
tem um argumento especificado ou lista de parâmetros. Por exemplo:
#import <Foundation/Foundation.h>

#define message_for(a, b) \
NSLog(@#a " and " #b ": We love you!\n")

int main(void)
{
message_for(Carole, Debra);
return 0;
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado:


2013-09-14 05:46:14.859 demo[20683] Carole and Debra: We love you!

Colando token (##)


O operador token-colar (##) dentro de uma definição de macro combina dois argumentos. Ele permite
que dois tokens separados na definição de macro a serem unidas em um único token. Por exemplo:
#import <Foundation/Foundation.h>

#define tokenpaster(n) NSLog (@"token" #n " = %d", token##n)

int main(void)
{
int token34 = 40;

tokenpaster(34);
return 0;
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado:


2013-09-14 05:48:14.859 demo[20683] token34 = 40

Como isso aconteceu, porque este exemplo resulta na seguinte saída real do pré-processador:
NSLog (@"token34 = %d", token34);

Este exemplo mostra a concatenação de ## símbolo n em token34 e aqui temos usado tantostringize e
token-colar.

62 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
O () Operador definido
O operadordefinido do pré-processador é utilizado em expressões constantes para determinar se
um identificador é definida utilizando #define.Se o identificador especificado está definida, o valor é
verdadeiro (não-zero). Se o símbolo não for definido, o valor é falso (zero). O operador definido é
especificado como segue:
#import <Foundation/Foundation.h>

#if !defined (MESSAGE)


#define MESSAGE "You wish!"
#endif

int main(void)
{
NSLog(@"Here is the message: %s\n", MESSAGE);
return 0;
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado:


2013-09-14 05:48:19.859 demo[20683] Here is the message: You wish!

macros parametrizadas
Uma das funções poderosas do OCPP é a capacidade de simular funções usando macros
parametrizadas. Por exemplo, poderíamos ter algum código para enquadrar um número como segue:
int square(int x) {
return x * x;
}

Podemos reescrever o código acima usando um macro da seguinte forma:


#define square(x) ((x) * (x))

Macros com argumentos devem ser definidos usando a diretiva#define antes que eles podem ser
usados.A lista de argumentos é colocado entre parênteses e deve seguir imediatamente o nome da
macro. Os espaços não são permitidos entre o nome de macro e parêntese de abertura. Por exemplo:
#import <Foundation/Foundation.h>

#define MAX(x,y) ((x) > (y) ? (x) : (y))

int main(void)
{
NSLog(@"Max between 20 and 10 is %d\n", MAX(10, 20));
return 0;

63 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado:


2013-09-14 05:52:15.859 demo[20683] Max between 20 and 10 is 20

Objective-C typedef
A linguagem de programação Objective-C fornece uma palavra-chave chamada typedef, que você
pode usar para dar um tipo um novo nome. A seguir é um exemplo para definir um BYTE prazo
para os números de um byte:
typedef unsigned char BYTE;

Após esta definição de tipo, o byte de identificador pode ser utilizado como uma abreviatura para o
unsigned char tipo, por exemplo:.
BYTE b1, b2;

Por convenção, as letras maiúsculas são utilizadas para estas definições para lembrar o usuário de que o
nome do tipo é realmente uma abreviatura simbólico, mas você pode usar letras minúsculas, como
segue:
typedef unsigned char byte;

Você pode usar typedef para dar um nome ao tipo de dados definido pelo usuário também. Por
exemplo, você pode usar typedef com estrutura para definir um novo tipo de dados e, em seguida, usar
esse tipo de dados para definir variáveis de estrutura diretamente da seguinte forma:
#import <Foundation/Foundation.h>

typedef struct Books


{
NSString *title;
NSString *author;
NSString *subject;
int book_id;

} Book;

int main( )
{

Book book;
book.title = @"Objective-C Programming";

64 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
book.author = @"TutorialsPoint";
book.subject = @"Programming tutorial";
book.book_id = 100;
NSLog( @"Book title : %@\n", book.title);
NSLog( @"Book author : %@\n", book.author);
NSLog( @"Book subject : %@\n", book.subject);
NSLog( @"Book Id : %d\n", book.book_id);

return 0;
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado:


2013-09-12 12:21:53.745 demo[31183] Book title : Objective-C Programming
2013-09-12 12:21:53.745 demo[31183] Book author : TutorialsPoint
2013-09-12 12:21:53.745 demo[31183] Book subject : Programming tutorial
2013-09-12 12:21:53.745 demo[31183] Book Id : 100

typedef vs #define
O #define é uma directiva Objective-C, que também é usado para definir os aliases de vários tipos
de dados semelhantes, a typedef, mas com as seguintes diferenças:
• O typedef se limita a dar nomes simbólicos para tipos única enquanto #define pode ser
usado para definir alias para valores bem, como você pode definir uma como UM, etc.
• A interpretação typedef é realizada pelo compilador onde como declarações #define são
processados pelo pré-processador.
Segue-se uma utilização mais simples de #define:
#import <Foundation/Foundation.h>

#define TRUE 1
#define FALSE 0

int main( )
{
NSLog( @"Value of TRUE : %d\n", TRUE);
NSLog( @"Value of FALSE : %d\n", FALSE);

return 0;
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado:


2013-09-12 12:23:37.993 demo[5160] Value of TRUE : 1
2013-09-12 12:23:37.994 demo[5160] Value of FALSE : 0

65 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C

Objective-C tipo Casting


Tipo casting é uma maneira de converter uma variável de um tipo de dados para outro tipo de dados.
Por exemplo, se você deseja armazenar um valor longo em um inteiro simples, em seguida, você pode
digitar lançado longa para int. Você pode converter valores de um tipo para outro explicitamente
usando o operador de conversão da seguinte forma:
(type_name) expression

Em Objective-C, geralmente usamos CGFloat para fazer operação de ponto flutuante, o qual é derivado
do tipo básico do flutuador em caso de 32-bit e dupla no caso de 64-bit. Considere o seguinte exemplo
onde o operador de conversão faz com que a divisão de uma variável inteiro por outra a ser executada
como uma operação de ponto flutuante:
#import <Foundation/Foundation.h>

int main()
{
int sum = 17, count = 5;
CGFloat mean;

mean = (CGFloat) sum / count;


NSLog(@"Value of mean : %f\n", mean );

return 0;
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado:


2013-09-11 01:35:40.047 demo[20634] Value of mean : 3.400000

Deve-se notar aqui que o operador de conversão tem precedência sobre a divisão, então o valor dasoma
é primeiro convertido no tipo doublee, finalmente, ele é dividido por contagem rendendo um
valor duplo.
As conversões de tipo pode ser implícito que é realizado pelo compilador automaticamente ou pode ser
especificado expressamente, através da utilização do operador de conversão. É considerada boa
prática de programação para usar o operador de conversão sempre que as conversões de tipo são
necessárias.

66 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
Promoção integer
Promoção inteiro é o processo pelo qual os valores do tipo inteiro "menor" do que int ou int sem sinal
são convertidos tanto para int ou int sem sinal. Considere um exemplo de adição de um personagem
em um int:
#import <Foundation/Foundation.h>

int main()
{
int i = 17;
char c = 'c'; /* ascii value is 99 */
int sum;

sum = i + c;
NSLog(@"Value of sum : %d\n", sum );

return 0;
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado:


2013-09-11 01:38:28.492 demo[980] Value of sum : 116

Aqui, o valor da soma está vindo como 116 porque compilador está fazendo promoção inteiro e
convertendo o valor de 'c' para ascii antes de realizar operação de adição real.

Conversão aritmética habitual


As conversões aritméticas usuais são executados implicitamente para lançar seus valores em um
tipo comum. Compiler primeira realiza a promoção do inteiro, se operandos ainda têm tipos diferentes,
então eles são convertidos para o tipo que aparece mais alto na seguinte hierarquia:

67 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C

As conversões aritméticas usuais não são executadas para os operadores de atribuição, nem para os
operadores lógicos && e ||. Tomemos seguinte exemplo para entender o conceito:
#import <Foundation/Foundation.h>

int main()
{
int i = 17;
char c = 'c'; /* ascii value is 99 */
CGFloat sum;

sum = i + c;
NSLog(@"Value of sum : %f\n", sum );
return 0;
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado:


2013-09-11 01:41:39.192 demo[15351] Value of sum : 116.000000

68 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
Aqui, é simples de entender que a primeira c é convertido para inteiro, mas porque o valor final é float,
conversão aritmética de forma habitual se aplica e compilador converte i e c na bóia e adicioná-los
produzindo um resultado float.

Objective-C log Manuseamento

método NSLog
A fim de registos de impressão, usamos o método NSLog na linguagem de programação Objective-C,
que temos usado desde o exemplo Olá Mundo.
Vejamos um simples código que iria imprimir as palavras "Olá Mundo":
#import <Foundation/Foundation.h>

int main()
{
NSLog(@"Hello, World! \n");
return 0;
}

Agora, quando compilar e executar o programa, iremos obter o seguinte resultado.


2013-09-16 00:32:50.888 demo[16669] Hello, World!

Incapacitantes registros em aplicações ao vivo


Uma vez que os NSLogs que usamos em nossa aplicação, ele será impresso nos logs de dispositivo e
não é bom para imprimir registros em uma compilação ao vivo. Por isso, usamos uma definição de tipo
para a impressão de registos e podemos usá-los como mostrado abaixo.
#import <Foundation/Foundation.h>

#if DEBUG == 0
#define DebugLog(...)
#elif DEBUG == 1
#define DebugLog(...) NSLog(__VA_ARGS__)
#endif

int main()
{
DebugLog(@"Debug log, our custom addition gets \
printed during debug only" );
NSLog(@"NSLog gets printed always" );
return 0;

69 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
}

Agora, quando compilar e executar o programa no modo de depuração, vamos obter o seguinte
resultado.
2013-09-11 02:47:07.723 demo[618] Debug log, our custom addition gets printed
during debug only
2013-09-11 02:47:07.723 demo[618] NSLog gets printed always

Agora, quando compilar e executar o programa em modo de lançamento, vamos obter o seguinte
resultado.
2013-09-11 02:47:45.248 demo[3158] NSLog gets printed always

Objective-C Tratamento de erros


Na programação Objective-C, manipulação de erro é fornecido com NSError classe disponível no
quadro Foundation.
Um objeto NSError encapsula mais rico e mais extensível informações de erro do que é possível
usando apenas um código de erro ou string de erro. Os principais atributos de um objeto NSError são
um domínio de erro (representado por uma string), um código de erro específico do domínio e uma
informação dicionário do usuário contendo informações específicas do aplicativo.

NSError
programas Objective-C usam objetos NSError para transmitir informações sobre erros de execução que
os usuários precisam ser informados sobre. Na maioria dos casos, um programa exibe as informações
deste erro numa caixa de diálogo ou folha. Mas também pode interpretar as informações e quer pedir ao
usuário para tentar recuperar do erro ou tentar corrigir o erro por conta própria
NSError objeto consiste de:
• Domínio: O domínio de erro pode ser um dos domínios NSError predefinidos ou uma cadeia
arbitrária descrevendo um domínio personalizado e o domínio não deve ser nula.
• Código: O código de erro para o erro.
• Informação de usuário: O dicionário userInfo para o erro e userInfo pode ser nulo.
O exemplo a seguir mostra como criar um erro personalizado

70 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
NSString *domain = @"com.MyCompany.MyApplication.ErrorDomain";
NSString *desc = NSLocalizedString(@"Unable to complete the process", @"");
NSDictionary *userInfo = @{ NSLocalizedDescriptionKey : desc };
NSError *error = [NSError errorWithDomain:domain code:-101 userInfo:userInfo];

Aqui está o código completa da amostra de erro acima passado como referência a um ponteiro
#import <Foundation/Foundation.h>

@interface SampleClass:NSObject

-(NSString *) getEmployeeNameForID:(int) id withError:(NSError **)errorPtr;

@end

@implementation SampleClass

-(NSString *) getEmployeeNameForID:(int) id withError:(NSError **)errorPtr{


if(id == 1)
{
return @"Employee Test Name";
}
else
{
NSString *domain = @"com.MyCompany.MyApplication.ErrorDomain";
NSString *desc =@"Unable to complete the process";
NSDictionary *userInfo = [[NSDictionary alloc]
initWithObjectsAndKeys:desc,
@"NSLocalizedDescriptionKey",NULL];
*errorPtr = [NSError errorWithDomain:domain code:-101
userInfo:userInfo];
return @"";
}
}

@end

int main()
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
SampleClass *sampleClass = [[SampleClass alloc]init];
NSError *error = nil;
NSString *name1 = [sampleClass getEmployeeNameForID:1 withError:&error];

if(error)
{
NSLog(@"Error finding Name1: %@",error);
}
else
{
NSLog(@"Name1: %@",name1);
}

71 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C

error = nil;

NSString *name2 = [sampleClass getEmployeeNameForID:2 withError:&error];

if(error)
{
NSLog(@"Error finding Name2: %@",error);
}
else
{
NSLog(@"Name2: %@",name2);
}

[pool drain];
return 0;

No exemplo acima, voltamos um nome se o id é 1, caso contrário, vamos definir o objeto de erro
definido pelo usuário.
Quando o código acima é compilado e executado, ele produz o seguinte resultado:
2013-09-14 18:01:00.809 demo[27632] Name1: Employee Test Name
2013-09-14 18:01:00.809 demo[27632] Error finding Name2: Unable to complete the
process

Objective-C argumentos
É possível passar alguns valores a partir da linha de comando para seus programas Objective-C, quando
eles são executados. Esses valores são chamados de argumentos de linha de comando e muitas vezes
eles são importantes para o seu programa, especialmente quando você quiser controlar o seu
programa de fora em vez de codificar esses valores dentro do código.
Os argumentos de linha de comando são tratadas usando principais argumentos da função (), onde argc
se refere ao número de argumentos passados, e argv [] é uma matriz de ponteiro, que aponta
para cada argumento passado para o programa. A seguir é um exemplo simples, que verifica se há
qualquer argumento fornecido a partir da linha de comando e agir em conformidade:
#import <Foundation/Foundation.h>

int main( int argc, char *argv[] )


{
if( argc == 2 )
{

72 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
NSLog(@"The argument supplied is %s\n", argv[1]);
}
else if( argc > 2 )
{
NSLog(@"Too many arguments supplied.\n");
}
else
{
NSLog(@"One argument expected.\n");
}
}

Quando o código acima é compilado e executado com um único argumento, diga "testando", ela produz
o seguinte resultado.
2013-09-13 03:01:17.333 demo[7640] The argument supplied is testing

Quando o código acima é compilado e executado com dois argumentos, dizem Testing1 e testing2,
produz o seguinte resultado.
2013-09-13 03:01:18.333 demo[7640] Too many arguments supplied.

Quando o código acima é compilado e executado sem passar qualquer argumento, ela produz o
seguinte resultado.
2013-09-13 03:01:18.333 demo[7640] One argument expected

Deve notar-se que argv [0] contém o nome do programa em si e argv [1] é um ponteiro para o
primeiro argumento de linha de comando fornecido, e * argv [n] é o último argumento. Se
nenhum argumento for fornecido, argc será um, caso contrário, se você passar um argumento, em
seguida, argc é fixado em 2.
Você passa todos os argumentos de linha de comando separados por um espaço, mas se o próprio
argumento tem um espaço, então você pode passar esses argumentos, colocando-os dentro de aspas
duplas "" ou aspas simples ''. Vamos re-escrever exemplo acima, mais uma vez, onde vamos imprimir
nome do programa e também passar um argumento de linha de comando, colocando dentro de aspas:
#import <Foundation/Foundation.h>

int main( int argc, char *argv[] )


{
NSLog(@"Program name %s\n", argv[0]);

if( argc == 2 )
{
NSLog(@"The argument supplied is %s\n", argv[1]);
}
else if( argc > 2 )

73 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
{
NSLog(@"Too many arguments supplied.\n");
}
else
{
NSLog(@"One argument expected.\n");
}
return 0;
}

Quando o código acima é compilado e executado com um único argumento separados por espaço, mas
dentro de aspas dizer "Testing1 Testing2", ela produz o seguinte resultado.
2013-09-14 04:07:57.305 demo[8534] Program name demo
2013-09-14 04:07:57.305 demo[8534] The argument supplied is Testing1 Testing 2

Objective-C Classes e Objetos


O principal objetivo da linguagem de programação Objective-C é adicionar orientação a objetos para a
linguagem de programação C e as classes são a característica central do Objective-C que suportam
programação orientada a objetos e muitas vezes são chamados de tipos definidos pelo usuário.
A classe é usada para especificar a forma de um objeto e ele combina representação de dados e métodos
para manipular esses dados em um pacote puro. Os dados e métodos dentro de uma classe são
chamados os membros da classe.

características Objective-C
• A classe é definida em duas seções diferentes, ou seja @interface e @implementation.
• Quase tudo é em forma de objetos.
• Objetos receber mensagens e objetos são muitas vezes referidas como receptores.
• Objetos contêm variáveis de instância.
• Objetos e variáveis de instância têm escopo.
• Classes esconder a implementação de um objeto.
• Propriedades são usadas para fornecer acesso a variáveis de instância de classe em outras
classes.

74 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
Objective-C Classe Definições:
Quando você define uma classe, você define um modelo para um tipo de dados. Este na verdade não
define todos os dados, mas não definir o que o nome da classe significa, isto é, o que é um objeto da
classe será composta de e quais operações podem ser realizadas em tal objeto.
A definição de classe começa com a palavra-chave @ interface seguido pelo (classe) nome de
interface; e do corpo da classe, fechado por um par de chaves. Em Objective-C, todas as classes são
derivadas da classe base chamada NSObject. É a superclasse de todas as classes Objective-C. Ele
fornece métodos básicos, como alocação de memória e de inicialização. Por exemplo, nós definimos o
tipo de dados da caixa utilizando a palavra-chave classe da seguinte forma:
@interface Box:NSObject
{
//Instance variables
double length; // Length of a box
double breadth; // Breadth of a box
}
@property(nonatomic, readwrite) double height; // Property

@end

As variáveis de instância são privadas e são acessíveis apenas dentro da implementação da classe.

Alocar e inicializar Objective-C objetos:


A classe fornece os planos para objetos, por isso, basicamente, um objeto é criado a partir de uma
classe. Declaramos objetos de uma classe com exatamente o mesmo tipo de declaração que declarar
variáveis de tipos básicos. Seguintes declarações declarar dois objetos de caixa de classe:
Box box1 = [[Box alloc]init]; // Create box1 object of type Box
Box box2 = [[Box alloc]init]; // Create box2 object of type Box

Ambos do box1 objetos e box2 terá sua própria cópia de membros de dados.

Acessando os membros de dados:


As propriedades de objetos de uma classe pode ser acessada usando o operador de acesso membro
direto (.). Vamos tentar o seguinte exemplo para tornar as coisas claras:
#import <Foundation/Foundation.h>

@interface Box:NSObject
{
double length; // Length of a box
double breadth; // Breadth of a box

75 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
double height; // Height of a box
}
@property(nonatomic, readwrite) double height; // Property

-(double) volume;

@end

@implementation Box

@synthesize height;

-(id)init
{
self = [super init];
length = 1.0;
breadth = 1.0;
return self;
}

-(double) volume
{
return length*breadth*height;
}

@end

int main( )
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Box *box1 = [[Box alloc]init]; // Create box1 object of type Box
Box *box2 = [[Box alloc]init]; // Create box2 object of type Box

double volume = 0.0; // Store the volume of a box here

// box 1 specification
box1.height = 5.0;

// box 2 specification
box2.height = 10.0;

// volume of box 1
volume = [box1 volume];
NSLog(@"Volume of Box1 : %f", volume);
// volume of box 2
volume = [box2 volume];
NSLog(@"Volume of Box2 : %f", volume);
[pool drain];
return 0;
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado:

76 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
2013-09-22 21:25:33.314 ClassAndObjects[387:303] Volume of Box1 : 5.000000
2013-09-22 21:25:33.316 ClassAndObjects[387:303] Volume of Box2 : 10.000000

propriedades:
As propriedades são introduzidos em Objective-C para assegurar que a variável instância da classe
pode ser acedido de fora da classe.
As várias partes são a declaração de propriedade são os seguintes.
• Propriedades começar com @property, que é uma palavra-chave
• Ele é seguido com especificadores de acesso, que são nonatomic ou atômica, readwrite ou
somente leitura e forte, unsafe_unretained ou fraco. Isso varia de acordo com o tipo da variável.
Para qualquer tipo de ponteiro, podemos usar forte, unsafe_unretained ou fraco. Da mesma
forma para outros tipos que podemos usar readwrite ou somente leitura.
• Isto é seguido pelo tipo de dados da variável.
• Finalmente, temos o nome da propriedade terminada por um ponto e vírgula.
• Podemos acrescentar declaração sintetizar na classe de implementação. Mas na última XCode, a
parte síntese é tomado cuidado pelo XCode e você não precisa incluir declaração sintetizar.
Ele só é possível com as propriedades que pode acessar as variáveis de instância da classe. Na verdade,
os métodos get e set internamente são criadas para as propriedades.
Por exemplo, vamos supor que temos um @property de propriedade (nonatomic, somente leitura)
BOOL isDone. Sob o capô, há setters e getters criados como mostrado abaixo.
-(void)setIsDone(BOOL)isDone;
-(BOOL)isDone;

Objective-C herdar
Um dos conceitos mais importantes na programação orientada a objetos é o de herança. Herança nos
permite definir uma classe em termos de outra classe que torna mais fácil para criar e manter um
aplicativo. Isso também fornece uma oportunidade de reutilizar a funcionalidade de código e tempo de
implementação rápida.

77 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
Ao criar uma classe, em vez de escrever completamente novo membros de dados e funções de membro,
o programador pode designar que a nova classe deve herdar os membros de uma classe existente. Esta
classe existente é chamado a classe base, e a nova classe é referida como a classe de derivados.
A idéia de herança implementa a uma relação. Por exemplo, mamífero IS-A animal, cão IS-Um
mamífero, daí cão IS-Um animal de bem e assim por diante.

De base e classes derivadas:


Objective-C só permite herança múltipla, ou seja, ele pode ter apenas uma classe base, mas permite
herança multinível. Todas as classes em Objective-C é derivado da superclasse NSObject.
@interface derived-class: base-class

Considere uma forma classe base e seu retângulo classe derivada da seguinte forma:
#import <Foundation/Foundation.h>

@interface Person : NSObject

{
NSString *personName;
NSInteger personAge;
}

- (id)initWithName:(NSString *)name andAge:(NSInteger)age;


- (void)print;
@end

@implementation Person

- (id)initWithName:(NSString *)name andAge:(NSInteger)age{


personName = name;
personAge = age;
return self;
}

- (void)print{
NSLog(@"Name: %@", personName);
NSLog(@"Age: %ld", personAge);
}

@end

@interface Employee : Person

{
NSString *employeeEducation;
}

78 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
- (id)initWithName:(NSString *)name andAge:(NSInteger)age
andEducation:(NSString *)education;
- (void)print;

@end

@implementation Employee

- (id)initWithName:(NSString *)name andAge:(NSInteger)age


andEducation: (NSString *)education
{
personName = name;
personAge = age;
employeeEducation = education;
return self;
}

- (void)print
{
NSLog(@"Name: %@", personName);
NSLog(@"Age: %ld", personAge);
NSLog(@"Education: %@", employeeEducation);
}

@end

int main(int argc, const char * argv[])


{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSLog(@"Base class Person Object");
Person *person = [[Person alloc]initWithName:@"Raj" andAge:5];
[person print];
NSLog(@"Inherited Class Employee Object");
Employee *employee = [[Employee alloc]initWithName:@"Raj"
andAge:5 andEducation:@"MBA"];
[employee print];
[pool drain];
return 0;
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado:


2013-09-22 21:20:09.842 Inheritance[349:303] Base class Person Object
2013-09-22 21:20:09.844 Inheritance[349:303] Name: Raj
2013-09-22 21:20:09.844 Inheritance[349:303] Age: 5
2013-09-22 21:20:09.845 Inheritance[349:303] Inherited Class Employee Object
2013-09-22 21:20:09.845 Inheritance[349:303] Name: Raj
2013-09-22 21:20:09.846 Inheritance[349:303] Age: 5
2013-09-22 21:20:09.846 Inheritance[349:303] Education: MBA

79 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
Controle de Acesso e Herança:
Uma classe derivada pode acessar todos os membros privados de sua classe base se ele está definido na
classe interface, mas não pode acessar membros particulares que são definidos no arquivo de
implementação.
Podemos resumir os diferentes tipos de acesso de acordo com quem pode acessá-los da seguinte forma:
A classe derivada herda todos os métodos de classe base e variáveis com as seguintes exceções:
• Variáveis declaradas no arquivo de implementação com a ajuda de extensões não é acessível.
• Métodos declarados no arquivo de implementação com a ajuda de extensões não é acessível.
• No caso de a classe herdada implementa o método na classe base, em seguida, o método na
classe derivada é executado.

Objective-C Polimorfismo
O polimorfismo palavra significa ter muitas formas. Normalmente, o polimorfismo ocorre quando
há uma hierarquia de classes e eles estão relacionados por herança.
Objectivo polimorfismo-C indica que uma chamada para uma função de membro irá causar uma função
diferente a ser executado, dependendo do tipo de objecto que invoca a função.
Considere o exemplo, temos uma forma classe que fornece a interface básica para todas as formas.
Quadrado e do retângulo são derivadas da Forma classe base.
Temos a printArea método que vai mostrar sobre o polimorfismo recurso OOP.
#import <Foundation/Foundation.h>

@interface Shape : NSObject

{
CGFloat area;
}

- (void)printArea;
- (void)calculateArea;
@end

@implementation Shape

- (void)printArea{
NSLog(@"The area is %f", area);

80 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
}

- (void)calculateArea{

@end

@interface Square : Shape


{
CGFloat length;
}

- (id)initWithSide:(CGFloat)side;

- (void)calculateArea;

@end

@implementation Square

- (id)initWithSide:(CGFloat)side{
length = side;
return self;
}

- (void)calculateArea{
area = length * length;
}

- (void)printArea{
NSLog(@"The area of square is %f", area);
}

@end

@interface Rectangle : Shape


{
CGFloat length;
CGFloat breadth;
}

- (id)initWithLength:(CGFloat)rLength andBreadth:(CGFloat)rBreadth;

@end

@implementation Rectangle

- (id)initWithLength:(CGFloat)rLength andBreadth:(CGFloat)rBreadth{
length = rLength;
breadth = rBreadth;
return self;

81 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
}

- (void)calculateArea{
area = length * breadth;
}

@end

int main(int argc, const char * argv[])


{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Shape *square = [[Square alloc]initWithSide:10.0];
[square calculateArea];
[square printArea];
Shape *rect = [[Rectangle alloc]
initWithLength:10.0 andBreadth:5.0];
[rect calculateArea];
[rect printArea];
[pool drain];
return 0;
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado:


2013-09-22 21:21:50.785 Polymorphism[358:303] The area of square is 100.000000
2013-09-22 21:21:50.786 Polymorphism[358:303] The area is 50.000000

No exemplo acima com base na disponibilidade da calculateArea método e printArea, quer o método
na classe base ou a classe derivada executado.
Polimorfismo lida com a mudança de métodos entre a classe base e classe derivada com base na
implementação do método das duas classes.

Objective-C encapsulamento de dados


Todos os programas de Objective-C são compostos de dois elementos fundamentais seguintes:
• Instruções de programa (código): Esta é a parte de um programa que executa acções e são
chamados métodos.
• Dados do Programa: Os dados são as informações do programa, que é afetada pelas
funções do programa.

82 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
Encapsulamento é um conceito de programação orientada a objetos que une os dados e funções que
manipulam os dados e que mantém os dois a salvo de interferências externas e uso indevido.
Encapsulamento de dados levou ao conceito OOP importante de ocultação de dados.
Encapsulamento de dados é um mecanismo de agregação dos dados e das funções que os utilizam,
e abstração de dados é um mecanismo de expor apenas as interfaces e esconder os detalhes de
implementação do usuário.
Objective-C suporta as propriedades de encapsulamento e dados que escondem através da criação de
tipos definidos pelo usuário, chamados de classes. Por exemplo:
@interface Adder : NSObject
{
NSInteger total;
}

- (id)initWithInitialNumber:(NSInteger)initialNumber;

- (void)addNumber:(NSInteger)newNumber;

- (NSInteger)getTotal;

@end

O total variável é privado e não podemos acessar de fora da classe. Isso significa que eles só podem ser
acessados por outros membros da classe Adder e não por qualquer outra parte do seu programa. Esta é
uma forma de encapsulamento é alcançado.
Métodos dentro do arquivo de interface são acessíveis e são públicos no escopo.
Existem métodos privados, que são escritos com a ajuda de extensões, o que vai aprender nos
próximos capítulos.

Encapsulamento de Dados Exemplo:


Qualquer programa de Objective-C, onde você implementar uma classe com variáveis membros
públicos e privados é um exemplo de encapsulamento de dados e abstração de dados. Considere o
seguinte exemplo:
#import <Foundation/Foundation.h>

@interface Adder : NSObject


{
NSInteger total;
}

- (id)initWithInitialNumber:(NSInteger)initialNumber;

83 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C

- (void)addNumber:(NSInteger)newNumber;

- (NSInteger)getTotal;

@end

@implementation Adder

-(id)initWithInitialNumber:(NSInteger)initialNumber{
total = initialNumber;
return self;
}

- (void)addNumber:(NSInteger)newNumber{
total = total + newNumber;
}

- (NSInteger)getTotal{
return total;
}

@end

int main(int argc, const char * argv[])


{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Adder *adder = [[Adder alloc]initWithInitialNumber:10];
[adder addNumber:5];
[adder addNumber:4];
NSLog(@"The total is %ld",[adder getTotal]);
[pool drain];
return 0;
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado:


2013-09-22 21:17:30.485 DataEncapsulation[317:303] The total is 19

Acima de classe adiciona números e retorna a soma. Os membros públicos addNum e getTotal são as
interfaces com o mundo exterior e um usuário precisa conhecê-los usar a classe. O total de
membro privado é algo que está escondido do mundo exterior, mas é necessária para a classe
para funcionar corretamente.

Estratégia Designing:
A maioria de nós aprender com a experiência amarga para fazer os membros da classe privados por
padrão, a menos que realmente precisamos para expô-los. Isso é apenas bom encapsulamento.

84 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
É importante compreender encapsulamento de dados, já que é uma das características fundamentais de
todas as linguagens de programação orientada a objetos (OOP), incluindo Objective-C.

Objective-C Categorias
Às vezes, você pode achar que você deseja estender uma classe existente adicionando comportamento
que é útil apenas em determinadas situações. A fim adicionar essa extensão classes existentes,
Objective-C fornece as categorias e extensões.
Se você precisa adicionar um método para uma classe existente, talvez, para adicionar funcionalidade
para torná-lo mais fácil de fazer algo em seu próprio aplicativo, a maneira mais fácil é usar uma
categoria.
A sintaxe para declarar uma categoria usa a palavra-chave @ interface, assim como uma descrição
padrão classe Objective-C, mas não indica qualquer herança de uma subclasse. Em vez disso, ele
especifica o nome da categoria em parênteses, como este:
@interface ClassName (CategoryName)

@end

Características da categoria
• Uma categoria pode ser declarado para qualquer classe, mesmo se você não tem o código-fonte
implementação original.
• Quaisquer métodos que você declara em uma categoria estará disponível para todas as
instâncias da classe original, bem como quaisquer subclasses da classe original.
• Em tempo de execução, não há nenhuma diferença entre um método adicionado por uma
categoria e um que é implementado pela classe original.
Agora, vamos olhar para uma implementação categoria amostra. Vamos adicionar uma categoria ao
NSString classe Cacau. Esta categoria irá torná-lo possível para nós para adicionar um novo método
getCopyRightString que nos ajuda em voltar a string de direitos de autor. Mostra-se abaixo.
#import <Foundation/Foundation.h>

@interface NSString(MyAdditions)

+(NSString *)getCopyRightString;

85 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
@end

@implementation NSString(MyAdditions)

+(NSString *)getCopyRightString{
return @"Copyright TutorialsPoint.com 2013";
}

@end

int main(int argc, const char * argv[])


{

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];


NSString *copyrightString = [NSString getCopyRightString];
NSLog(@"Accessing Category: %@",copyrightString);
[pool drain];
return 0;
}

Agora, quando compilar e executar o programa, iremos obter o seguinte resultado.


2013-09-22 21:19:12.125 Categories[340:303] Accessing Category: Copyright
TutorialsPoint.com 2013

Apesar de quaisquer métodos adicionados por uma categoria estão disponíveis para todas as instâncias
da classe e suas subclasses, você precisará importar o arquivo da categoria do cabeçalho em qualquer
arquivo de código fonte que você deseja usar os métodos adicionais, caso contrário, você vai correr em
avisos do compilador e erros.
No nosso exemplo, uma vez que só temos uma única classe, nós não incluídos quaisquer arquivos de
cabeçalho, em tal caso, devemos incluir os arquivos de cabeçalho, como disse acima.

Objective-C Levantando (Posing)


Antes de iniciar sobre Levantamento no Objective-C, eu gostaria de trazer para o seu aviso de que
Levantando foi declarado obsoleto no Mac OS X 10.5 e ele não está disponível para uso depois.
Portanto, para aqueles que não estão preocupados com esses métodos obsoletos pode ignorar este
capítulo.
Objective-C permite uma classe para todo substituir outra classe dentro de um programa. A classe
substituindo é dito que "colocam como" a classe alvo.

86 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
Para as versões que apoiaram levantamento, todas as mensagens enviadas para a classe de destino são
em vez recebida pela classe posando.
NSObject contém o poseAsClass: método que nos permite substituir a classe existente, como disse
acima.

Restrições no levantamento
• Uma classe só pode posar como uma das suas superclasses diretas ou indiretas.
• A classe de levantamento não deve definir eventuais novas variáveis de instância que estão
ausentes da classe alvo (embora possa definir ou substituir métodos).
• A classe de destino pode não ter recebido quaisquer mensagens antes do levantamento.
• Uma classe de levantamento pode chamar métodos substituídos por meio super, incorporando,
assim, a implementação da classe alvo.
• Uma classe de levantamento pode substituir os métodos definidos nas categorias.
#import <Foundation/Foundation.h>

@interface MyString : NSString

@end

@implementation MyString

- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target


withString:(NSString *)replacement
{
NSLog(@"The Target string is %@",target);
NSLog(@"The Replacement string is %@",replacement);
}

@end

int main()
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
[MyString poseAsClass:[NSString class]];
NSString *string = @"Test";
[string stringByReplacingOccurrencesOfString:@"a" withString:@"c"];
[pool drain];
return 0;
}

Agora, quando compilar e executar o programa em um mais velho Mac OS X (V_10.5 ou anterior),
teremos o seguinte resultado.

87 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
2013-09-22 21:23:46.829 Posing[372:303] The Target string is a
2013-09-22 21:23:46.830 Posing[372:303] The Replacement string is c

No exemplo acima, nós apenas poluído o método original com a nossa implementação e isso vai ficar
afectado por todas as operações NSString com o método acima.

Objective-C extensões
A extensão de classe tem algumas semelhanças com uma categoria, mas só pode ser adicionado a uma
classe para a qual você tem o código-fonte em tempo de compilação (a classe é compilada, ao mesmo
tempo que a extensão de classe).
Os métodos declarados por uma extensão de classe são implementadas no bloco de implementação para
a classe original, então você não pode, por exemplo, declarar uma extensão de classe em uma classe
estrutura, como uma classe de cacau ou Cocoa Touch como NSString ..
As extensões são realmente categorias sem o nome da categoria. É muitas vezes referido como
categorias anónimos.
A sintaxe para declarar uma extensão usa a palavra-chave @ interface, assim como uma descrição
padrão classe Objective-C, mas não indica qualquer herança de uma subclasse. Em vez disso, ele só
acrescenta parênteses, como mostrado abaixo
@interface ClassName ()

@end

Características das extensões


• Uma extensão não pode ser declarado para qualquer classe, somente para as classes que temos
implementação original do código-fonte.
• Uma extensão é a adição de métodos privados e variáveis privadas que são apenas específicos
para a classe.
• Qualquer método ou variável declarada dentro das extensões não é acessível até mesmo para as
classes herdadas.

88 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
Exemplo extensões
Vamos criar um SampleClass classe que tem uma extensão. Na extensão, vamos ter um InternalID
variável privada.
Então, vamos ter um getExternalID método que retorna o externalId após o processamento da
InternalID.
O exemplo é mostrado abaixo e isso não vai funcionar no compilador online.
#import <Foundation/Foundation.h>

@interface SampleClass : NSObject


{
NSString *name;
}

- (void)setInternalID;
- (NSString *)getExternalID;

@end

@interface SampleClass()
{
NSString *internalID;
}

@end

@implementation SampleClass

- (void)setInternalID{
internalID = [NSString stringWithFormat:
@"UNIQUEINTERNALKEY%dUNIQUEINTERNALKEY",arc4random()%100];
}

- (NSString *)getExternalID{
return [internalID stringByReplacingOccurrencesOfString:
@"UNIQUEINTERNALKEY" withString:@""];
}

@end

int main(int argc, const char * argv[])


{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
SampleClass *sampleClass = [[SampleClass alloc]init];
[sampleClass setInternalID];
NSLog(@"ExternalID: %@",[sampleClass getExternalID]);
[pool drain];
return 0;

89 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
}

Agora, quando compilar e executar o programa, iremos obter o seguinte resultado.


2013-09-22 21:18:31.754 Extensions[331:303] ExternalID: 51

No exemplo acima, podemos ver que o InternalID não é devolvido diretamente. Nós aqui remover o
UNIQUEINTERNALKEY e só fazer o restante do valor disponível para o método getExternalID.
O exemplo acima usa apenas uma operação de cadeia, mas pode ter muitas características como
encriptação / desencriptação e assim por diante.

Objective-C protocolos
Objective-C permite definir protocolos, que declaram os métodos que deverão ser utilizados para uma
situação particular. Protocolos são implementados nas classes em conformidade com o protocolo.
Um exemplo simples seria uma classe manipulação de URL rede, ele terá um protocolo com métodos
como o método delegado processCompleted que sugere a classe chamada uma vez que o URL da rede
buscando operação é longo.
A sintaxe do protocolo é mostrado abaixo.
@protocol ProtocolName
@required
// list of required methods
@optional
// list of optional methods
@end

Os métodos sob palavra-chave @required devem ser implementados nas classes que está em
conformidade com o protocolo e os métodos sob palavra-chave @optional são opcionais para
implementar.
Aqui está a sintaxe para a classe em conformidade com o protocolo
@interface MyClass : NSObject <MyProtocol>
...
@end

Isto significa que qualquer instância de MyClass irá responder, não só para os métodos declarados
especificamente na interface, mas que também fornece MyClass implementações para os métodos

90 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
necessários em MyProtocol. Não há necessidade de declarar novamente os métodos de protocolo na
interface de classe - a aprovação do protocolo é suficiente.
Se você precisar de uma classe para adoptar vários protocolos, você pode especificá-los como uma lista
separada por vírgulas. Temos um objeto de delegação que detém a referência do objeto de chamada que
implementa o protocolo.
Um exemplo é mostrado abaixo.
#import <Foundation/Foundation.h>

@protocol PrintProtocolDelegate

- (void)processCompleted;

@end

@interface PrintClass :NSObject


{
id delegate;
}

- (void) printDetails;
- (void) setDelegate:(id)newDelegate;
@end

@implementation PrintClass

- (void)printDetails{
NSLog(@"Printing Details");
[delegate processCompleted];
}

- (void) setDelegate:(id)newDelegate{
delegate = newDelegate;
}

@end

@interface SampleClass:NSObject<PrintProtocolDelegate>

- (void)startAction;

@end

@implementation SampleClass

- (void)startAction{
PrintClass *printClass = [[PrintClass alloc]init];
[printClass setDelegate:self];
[printClass printDetails];

91 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
}

-(void)processCompleted{
NSLog(@"Printing Process Completed");
}

@end

int main(int argc, const char * argv[])


{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
SampleClass *sampleClass = [[SampleClass alloc]init];
[sampleClass startAction];
[pool drain];
return 0;
}

Agora, quando compilar e executar o programa, iremos obter o seguinte resultado.


2013-09-22 21:15:50.362 Protocols[275:303] Printing Details
2013-09-22 21:15:50.364 Protocols[275:303] Printing Process Completed

No exemplo acima, vimos como os métodos delgate são chamados e executados. Sua começa com
startAction, uma vez que o processo for concluído, o método delegado processCompleted é chamado a
insinuar a operação for concluída.
Em qualquer app iOS ou Mac, nunca teremos um programa implementado sem um delegado. Por isso é
importante que entender o uso de delegados. Delegados objetos devem utilizar tipo de propriedade
unsafe_unretained para evitar vazamentos de memória.

Objective-C ligação dinâmica


Vinculação dinâmica é determinar o método para invocar em tempo de execução em vez de em tempo
de compilação. Ligação dinâmica também é referido como ligação tardia.
Em Objective-C, todos os métodos são resolvidos de forma dinâmica em tempo de execução. O código
exato executado é determinado tanto pelo nome do método (o seletor) e do objeto receptor.
ligação dinâmica permite polimorfismo. Por exemplo, considere uma coleção de objetos, incluindo
Retângulo e Square. Cada objeto tem sua própria implementação de um método printArea.
No fragmento de código a seguir, o código real que deve ser executada pela expressão [anObject
printArea] é determinada em tempo de execução. O sistema de tempo de execução usa o seletor para o

92 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
método de execução para identificar o método apropriado em qualquer classe de anObject acaba por
ser.
Vejamos um código simples que explicaria ligação dinâmica.
#import <Foundation/Foundation.h>

@interface Square:NSObject
{
float area;
}
- (void)calculateAreaOfSide:(CGFloat)side;
- (void)printArea;
@end

@implementation Square

- (void)calculateAreaOfSide:(CGFloat)side
{
area = side * side;
}
- (void)printArea
{
NSLog(@"The area of square is %f",area);
}

@end

@interface Rectangle:NSObject
{
float area;
}
- (void)calculateAreaOfLength:(CGFloat)length andBreadth:(CGFloat)breadth;
- (void)printArea;
@end

@implementation Rectangle

- (void)calculateAreaOfLength:(CGFloat)length andBreadth:(CGFloat)breadth
{
area = length * breadth;
}
- (void)printArea
{
NSLog(@"The area of Rectangle is %f",area);
}

@end

int main()
{
Square *square = [[Square alloc]init];
[square calculateAreaOfSide:10.0];

93 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
Rectangle *rectangle = [[Rectangle alloc]init];
[rectangle calculateAreaOfLength:10.0 andBreadth:5.0];
NSArray *shapes = [[NSArray alloc]initWithObjects: square, rectangle,nil];
id object1 = [shapes objectAtIndex:0];
[object1 printArea];
id object2 = [shapes objectAtIndex:1];
[object2 printArea];
return 0;
}

Agora, quando compilar e executar o programa, iremos obter o seguinte resultado.


2013-09-28 07:42:29.821 demo[4916] The area of square is 100.000000
2013-09-28 07:42:29.821 demo[4916] The area of Rectangle is 50.000000

Como você pode ver no exemplo acima, o método printArea é selecionada dinamicamente em tempo
de execução. É um exemplo de ligação dinâmica e é bastante útil em muitas situações, quando se lida
com objectos de tipo semelhante.

Objective-C objetos compostos


Podemos criar subclasse dentro de um cluster classe que define uma classe que incorpora no seu
interior um objeto. Esses objetos de classe são objetos compostos.
Então você pode estar se perguntando o que é um cluster de classe. Então, vamos primeiro ver o que é
um cluster de classe.

Clusters de classe
clusters de classe são um padrão de design que o quadro Foundation faz uso extensivo de. clusters de
craveira grupo uma série de subclasses concretas privadas sob uma superclasse abstrata público. O
agrupamento das classes dessa maneira simplifica a arquitetura publicamente visível de uma estrutura
orientada a objetos, sem reduzir a sua riqueza funcional. clusters de craveira são baseados no padrão de
projeto Abstract Factory.
Para tornar mais simples, em vez de criar várias classes para funções semelhantes, criamos uma única
classe que vai cuidar de sua manipulação com base no valor da entrada.
Por exemplo, em NSNumber dispomos de muitos grupos de classes como char, int, boleano e assim por
diante. Nós grupo todos eles para uma única classe que cuida de lidar com as operações similares em
uma única classe. NSNumber realmente envolve o valor desses tipos primitivos em objetos.

94 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
Então, qual é objeto exatamente composta?
Ao incorporar um objeto de cluster privada em um objeto de nosso próprio projeto, criamos um objeto
composto. Este objeto composto pode contar com o objeto de cluster para a sua funcionalidade básica,
apenas a interceptação de mensagens que o objeto composto quer lidar de alguma forma particular.
Essa arquitetura reduz a quantidade de código que deve escrever e permite-lhe tirar proveito do código
testados, fornecidos pela Fundação Framework.
Isto é explicado na figura a seguir.

O objeto composto deve declarar-se a ser uma subclasse de superclasse abstrata do cluster. Como uma
subclasse, deve substituir os métodos primitivos da superclasse. É também possível substituir métodos
derivados, mas isso não é necessário porque os métodos derivados trabalhar através das primitivas.
O método de contagem da classe NSArray é um exemplo; implementação do objecto de intervenção de
um método que substitui pode ser tão simples como:
- (unsigned)count
{
return [embeddedObject count];
}

No exemplo acima, objeto incorporado é realmente do tipo NSArray.

Um exemplo de objeto Composite


Agora, a fim de ver um exemplo completo, vamos olhar para o exemplo da documentação da Apple,
que é dado abaixo.
#import <Foundation/Foundation.h>

@interface ValidatingArray : NSMutableArray


{
NSMutableArray *embeddedArray;

95 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
}

+ validatingArray;
- init;
- (unsigned)count;
- objectAtIndex:(unsigned)index;
- (void)addObject:object;
- (void)replaceObjectAtIndex:(unsigned)index withObject:object;
- (void)removeLastObject;
- (void)insertObject:object atIndex:(unsigned)index;
- (void)removeObjectAtIndex:(unsigned)index;

@end

@implementation ValidatingArray
- init
{
self = [super init];
if (self) {
embeddedArray = [[NSMutableArray allocWithZone:[self zone]] init];
}
return self;
}

+ validatingArray
{
return [[self alloc] init] ;
}
- (unsigned)count
{
return [embeddedArray count];
}
- objectAtIndex:(unsigned)index
{
return [embeddedArray objectAtIndex:index];
}
- (void)addObject:(id)object
{
if (object != nil) {
[embeddedArray addObject:object];
}
}
- (void)replaceObjectAtIndex:(unsigned)index withObject:(id)object;
{
if (index <[embeddedArray count] && object != nil) {
[embeddedArray replaceObjectAtIndex:index withObject:object];
}
}
- (void)removeLastObject;
{
if ([embeddedArray count] > 0) {
[embeddedArray removeLastObject];
}
}

96 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
- (void)insertObject:(id)object atIndex:(unsigned)index;
{
if (object != nil) {
[embeddedArray insertObject:object atIndex:index];
}
}
- (void)removeObjectAtIndex:(unsigned)index;
{
if (index <[embeddedArray count]) {
[embeddedArray removeObjectAtIndex:index];
}
}

@end

int main()
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
ValidatingArray *validatingArray = [ValidatingArray validatingArray];
[validatingArray addObject:@"Object1"];
[validatingArray addObject:@"Object2"];
[validatingArray addObject:[NSNull null]];
[validatingArray removeObjectAtIndex:2];
NSString *aString = [validatingArray objectAtIndex:1];
NSLog(@"The value at Index 1 is %@",aString);
[pool drain];
return 0;
}

Agora, quando compilar e executar o programa, iremos obter o seguinte resultado.


2013-09-28 22:03:54.294 demo[6247] The value at Index 1 is Object2

No exemplo acima, podemos ver que uma função de validação da matriz não permitiria a adição de
objetos nulos que levarão a queda no cenário normal. Mas a nossa gama validar cuida dele. Do mesmo
modo, cada um de o método de validação matriz adiciona validar processos para além da sequência
normal de operações.

Objective-C Fondation Quadro


Se você consultar a documentação da Apple, você pode ver os detalhes do framework Foundation como
dado abaixo.
O quadro Foundation define uma camada de base das classes Objective-C. Além de fornecer um
conjunto de classes úteis de objetos primitivos, introduz vários paradigmas que definem funcionalidade

97 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
não coberta pela linguagem Objective-C. O quadro Foundation é projetado com esses objetivos em
mente:
• Fornecer um pequeno conjunto de classes de utilitários básicos.
• Tornar o desenvolvimento de software mais fácil através da introdução de convenções
consistentes para coisas como desalocação.
• cordas suporte a Unicode, objeto de persistência e de distribuição de objectos.
• Fornecer um nível de independência OS para melhorar a portabilidade.
O quadro foi desenvolvido pela NeXTStep, que foi adquirida pela Apple e essas classes de fundação
tornou-se parte do Mac OS X e iOS.
Desde que foi desenvolvido por NeXTStep, tem prefixo classe de "NS".
Temos usado Framework Foundation em todos os nossos programas de exemplo. É quase uma
obrigação de usar Foundation Framework.
Geralmente, usamos algo como #import <Foundation / NSString.h> para importar uma classe
Objective-C, mas em evitar a fim de importar muitas classes, tudo é importado no #import
<Foundation / Foundation.h>.
NSObject é a classe base de todos os objetos, incluindo as classes kit fundação. Ele fornece os métodos
para gerenciamento de memória. Ele também fornece uma interface básica para o sistema de execução
e capacidade de se comportar como objetos Objective-C. Ele não tem qualquer classe base e é a raiz de
todas as classes.

Foundation Classes com base na funcionalidade


loop Tipo Descrição
Armazenamento de NSArray, NSDictionary e NSSet fornecer armazenamento para objetos Objective-
dados C de qualquer classe.
NSCharacterSet representa vários grupos de caracteres que são usados pelas
classes NSString e NSScanner. As classes NSString representam cadeias de texto
Texto e cordas
e fornecer métodos para pesquisa, combinando e comparando strings. Um objeto
NSScanner é usado para digitalizar números e palavras de um objeto NSString.
As classes NSDate, NSTimeZone e NSCalendar armazenar horas e datas e
representar a informação de calendário. Eles oferecem métodos de cálculo de data
Datas e horários e hora diferenças. Juntamente com NSLocale, eles fornecem métodos para exibir
datas e horas em vários formatos e para ajustar horários e datas baseado em
localização no mundo.
Manipulação de A manipulação de exceção é usado para lidar com situações inesperadas e é

98 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
exceção oferecido em Objective-C com NSException.
manipulação de
manipulação de arquivos é feito com a ajuda de classe NSFileManager.
arquivos
Sistema de Um conjunto de classes e protocolos que fornecem acesso a protocolos comuns da
carregamento URL Internet.

Objective-C Contagem rápida


enumeração rápido é uma característica Objective-C do que ajuda na enumerando através de uma
coleção. Portanto, a fim de saber enumeração sobre rápido, precisamos saber sobre a primeira recolha
que será explicada na seção seguinte.

Coleções em Objective-C
As coleções são construções fundamentais. Ele é usado para armazenar e gerenciar outros objetos. A
propósito de uma coleção é que ele fornece uma maneira comum para armazenar e recuperar objetos de
forma eficiente.
Existem vários tipos diferentes de coleções. Embora todos eles cumprem a mesma finalidade de ser
capaz de conter outros objetos, eles diferem principalmente na forma como os objetos são recuperados.
As coleções mais comuns usados em Objective-C são:
• NSSet
• NSArray
• NSDictionary
• NSMutableSet
• NSMutableArray
• NSMutableDictionary
Se você quiser saber mais sobre essas estruturas, consulte o armazenamento de dados na Fundação
Framework .

Rápido enumeração Sintaxe


for (classType variable in collectionObject )

99 Fonte: http://www.w3ii.com/pt/objective_c/default.html
Apostila sobre Objective C
{
statements
}

Aqui está um exemplo para a enumeração rápida.


#import <Foundation/Foundation.h>

int main()
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSArray *array = [[NSArray alloc]
initWithObjects:@"string1", @"string2",@"string3",nil];
for(NSString *aString in array)
{
NSLog(@"Value: %@",aString);
}
[pool drain];
return 0;
}

Agora, quando compilar e executar o programa, iremos obter o seguinte resultado.


2013-09-28 06:26:22.835 demo[7426] Value: string1
2013-09-28 06:26:22.836 demo[7426] Value: string2
2013-09-28 06:26:22.836 demo[7426] Value: string3

Como você pode ver na saída, cada um dos objetos na matriz é impressa em uma ordem.

Contagem rápida para trás


for (classType variable in [collectionObject reverseObjectEnumerator] )
{
statements
}

Aqui está um exemplo para reverseObjectEnumerator na enumeração rápido.


#import <Foundation/Foundation.h>

int main()
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSArray *array = [[NSArray alloc]
initWithObjects:@"string1", @"string2",@"string3",nil];
for(NSString *aString in [array reverseObjectEnumerator])
{
NSLog(@"Value: %@",aString);
}
[pool drain];
return 0;

100 Fonte: http://www.w3ii.com/pt/objective_c/default.html


Apostila sobre Objective C
}

Agora, quando compilar e executar o programa, iremos obter o seguinte resultado.


2013-09-28 06:27:51.025 demo[12742] Value: string3
2013-09-28 06:27:51.025 demo[12742] Value: string2
2013-09-28 06:27:51.025 demo[12742] Value: string1

Como você pode ver na saída, cada um dos objetos na matriz é impresso, mas na ordem inversa em
comparação com a enumeração rápida normal.

Objective-C Gestão
gerenciamento de memória é um dos processos mais importantes em qualquer linguagem de
programação. É o processo pelo qual a memória de objetos são alocados quando eles são necessários e
desalocada quando eles não são mais necessários.
Gerenciando a memória objeto é uma questão de desempenho; se um aplicativo faz objetos
desnecessários não livres, a sua pegada de memória cresce e desempenho sofre.
técnicas de gerenciamento de memória em Objective-C podem ser classificados em dois tipos.
• "Manual Manter-Release" ou MRR
• "Automatic contagem de referência" ou ARC

"Manual Manter-Release" ou MRR


Em MRR, conseguimos explicitamente memória, mantendo o controle de objetos em nosso próprio
país. Isso é implementado usando um modelo, conhecido como contagem de referência, que a
Fundação classe NSObject fornece em conjunto com o ambiente de tempo de execução.
A única diferença entre MRR e ARC é que a retenção e liberação é tratado por nós manualmente no
primeiro, enquanto o seu cuidado automaticamente de no último.
A figura a seguir representa um exemplo de como o trabalho de gerenciamento de memória em
Objective-C.

101 Fonte: http://www.w3ii.com/pt/objective_c/default.html


Apostila sobre Objective C

O ciclo de vida do objecto de memória Classe A é mostrado na figura acima. Como você pode ver, a
contagem de reter é mostrado abaixo do objeto, quando a contagem de manter um objeto se torna 0, o
objeto é liberado completamente e sua memória é desalocado para outros objetos para usar.
Classe Um objeto é criado usando o método alloc / init disponível em NSObject. Agora, a contagem
torna-se reter um.
Agora, classe B mantém objeto da classe A ea contagem de manter objeto da classe A se torna 2.
Em seguida, a classe C faz uma cópia do objeto. Agora, ele é criado como outra instância do Classe A
com os mesmos valores para as variáveis de instância. Aqui, a contagem de manter é de 1 e não a
contagem do objeto original reter. Isto é representado pela linha a tracejado na figura.
O objeto copiado é libertado por Classe C utilizando o método de libertação e torna-se a contagem de
reter 0 e, portanto, o objecto é destruído.
No caso de o objecto inicial de Classe A, a contagem de manter é 2 e tem que ser libertado por duas
vezes, a fim de que possa ser destruída. Isto é feito através de declarações de libertação da classe A e
classe B, que diminui a contagem de reter a 1 e 0, respectivamente. Finalmente, o objecto é destruído.

102 Fonte: http://www.w3ii.com/pt/objective_c/default.html


Apostila sobre Objective C
MRR Regras básicas
• Nós próprios qualquer objeto que criamos: Criamos um objeto usando um método cujo nome
começa com "alloc", "novo", "cópia" ou "mutableCopy"
• Podemos tomar posse de um objeto usando reter: Um objeto recebido é normalmente garantido
para permanecer válidas dentro do método que foi recebido, e que o método também pode
retornar com segurança o objeto ao seu invocador. Usamos reter em duas situações:
• Na implementação de um método de acesso ou um método init, para apropriar-se de um
objeto que deseja armazenar como um valor da propriedade.
• Para impedir que um objecto seja invalidada como um efeito colateral de alguma outra
operação.
• Quando não precisar mais dele, devemos abdicar da propriedade de um objeto nós próprios:
Nós abdicar da propriedade de um objeto, enviando-lhe uma mensagem de liberação ou uma
mensagem de disparo automático. Na terminologia do Cacau, abandonando a propriedade de
um objeto é, portanto, normalmente referido como "lançando" um objeto.
• Você não deve abdicar da propriedade de um objeto que não possui: Este é apenas corolário das
regras de política anterior declarou explicitamente.
#import <Foundation/Foundation.h>

@interface SampleClass:NSObject
- (void)sampleMethod;
@end

@implementation SampleClass

- (void)sampleMethod
{
NSLog(@"Hello, World! \n");
}

- (void)dealloc
{
NSLog(@"Object deallocated");
[super dealloc];
}

@end

int main()
{
/* my first program in Objective-C */
SampleClass *sampleClass = [[SampleClass alloc]init];
[sampleClass sampleMethod];

103 Fonte: http://www.w3ii.com/pt/objective_c/default.html


Apostila sobre Objective C
NSLog(@"Retain Count after initial allocation: %d",
[sampleClass retainCount]);
[sampleClass retain];
NSLog(@"Retain Count after retain: %d", [sampleClass retainCount]);
[sampleClass release];
NSLog(@"Retain Count after release: %d", [sampleClass retainCount]);
[sampleClass release];
NSLog(@"SampleClass dealloc will be called before this");
// Should set the object to nil
sampleClass = nil;
return 0;
}

Quando compilar o programa acima, teremos o seguinte resultado.


2013-09-28 04:39:52.310 demo[8385] Hello, World!
2013-09-28 04:39:52.311 demo[8385] Retain Count after initial allocation: 1
2013-09-28 04:39:52.311 demo[8385] Retain Count after retain: 2
2013-09-28 04:39:52.311 demo[8385] Retain Count after release: 1
2013-09-28 04:39:52.311 demo[8385] Object deallocated
2013-09-28 04:39:52.311 demo[8385] SampleClass dealloc will be called before this

"Automatic contagem de referência" ou ARC


Na contagem de referência automático ou ARC, o sistema utiliza o mesmo sistema de contagem de
referência como MRR, mas insere o método de gerenciamento de memória apropriado chama para nós
em tempo de compilação. Estamos fortemente encorajados a usar ARC para novos projetos. Se usarmos
ARC, geralmente não há necessidade de compreender a aplicação subjacente descrito no presente
documento, embora em algumas situações pode ser útil. Para saber mais sobre ARC, consulte Transição
para ARC Release Notes.
Como mencionado acima, no ARC, não precisamos adicionar liberação e reter métodos desde que serão
atendidos pelo compilador. Na verdade, o processo subjacente de Objective-C continua a ser a mesma.
Ele usa a reter e operações de libertação fazendo internamente mais fácil para o desenvolvedor para o
código sem se preocupar com essas operações, o que irá reduzir a quantidade de código escrito ea
possibilidade de vazamentos de memória.
Havia um outro princípio chamado de coleta de lixo, que é usado no Mac OS-X, juntamente com MRR,
mas desde a sua reprovação no OS X Mountain Lion, não foi discutido juntamente com MRR. Além
disso, o iOS não tinha objetos recurso coleta de lixo. E com ARC, não há uso de coleta de lixo no OS-X
também.
Aqui está um exemplo ARC simples. Note que este não irá funcionar no compilador on-line, uma vez
que não suporta ARC.
#import <Foundation/Foundation.h>

104 Fonte: http://www.w3ii.com/pt/objective_c/default.html


Apostila sobre Objective C

@interface SampleClass:NSObject
- (void)sampleMethod;
@end

@implementation SampleClass

- (void)sampleMethod
{
NSLog(@"Hello, World! \n");
}

- (void)dealloc
{
NSLog(@"Object deallocated");
}

@end

int main()
{
/* my first program in Objective-C */
@autoreleasepool{
SampleClass *sampleClass = [[SampleClass alloc]init];
[sampleClass sampleMethod];
sampleClass = nil;
}
return 0;
}

Quando compilar o programa acima, teremos o seguinte resultado.


2013-09-28 04:45:47.310 demo[8385] Hello, World!
2013-09-28 04:45:47.311 demo[8385] Object deallocated

105 Fonte: http://www.w3ii.com/pt/objective_c/default.html

Você também pode gostar