Objota O mundo orientado a objetos

@property no Objective-C – Entendendo a linguagem

Posted on janeiro 6, 2011

Salve salve galera, como prometido, estou aqui novamente para escrever mais um artigo para entender a linguagem objetive-C.

Dessa vez eu vou falar um pouco sobre as propriedades no obj-C, vou tentar explicar como funciona da forma mais simples possível. No entanto o conteúdo que vou apresentar aqui é basicamente o conteúdo que você irá encontrar no site http://developer.apple.com/devcenter/ios/index.action, porém aqui eu vou simplificar a explicação e claro, vou escrever em português. Hehehe! Então vamos lá! Vocês conhecem o conceito para uso dos gets and seters? Se não conhece leia esse artigo que está disponível no site. Se já conhece esses conceitos básicos de OO vamos continuar.

No objective-C para criar nossas propriedades temos que usar a declaração @property da seguinte maneira:

@interface Teste : NSObject {
        @private int variavel;
}
//@property(atributo1, atributo1, ...) tipo nome;
@property (readwrite, assign) int variavel;
@end

Pronto! Dessa forma podemos criar nossas propriedades e adicionar atributos de acesso as variáveis e objetos das nossas classes. Mas ainda precisamos criar nosso get e set, para isso a linguagem nos da uma forma de fazer isso de forma automatizada usando a diretiva @synthesize no nosso arquivo .m, da seguinte maneira:

@implementation Teste
//@synthesize nome_da_variavel;
// Dessa forma é criado o get e set dessa variável get =  variavel, set = setVariavel. Pronto! Muito simples.
@synthesize variavel;
@end

Bom então agora já sabemos como criar nossas propriedades e dessa forma acessar de outras classe seus valores, porém precisamos ainda descobrir como funcionam os atributos de uma propriedade. Vou deixar para vocês aqui os exemplos contidos diretamente no site da apple para fins mais didáticos. Irei explicar os principais atributos que são eles: getter, setter, readwrite, readonly, assign, retain, copy e no meu ver um dos mais importantes nonatomic.

getter=nome_do_metodo_get: Você indica o nome do método que irá retornar o valor da variável

@property(getter=getMaria) int joao;

setter=nome_do_metodo_set: Você indica o nome do método que irá atribuir valor a variável.

@property(setter=setMaria) int joao;

readwrite: Por padrão ao você criar uma propriedade ela já é setada com essa propriedade que determina que a propriedade irá ser lida e sobrescrita.

@property(readwrite) int joao;

readonly: A propriedade pode ser apenas lida e não sobrescrita.

@property(readonly) int joao;

assign: Por padrão ao você criar uma propriedade ele é do tipo assign ou em outras palavras declaração simples.

@property(assign) int joao;

retain: Quando sua propriedade é do tipo ponteiro ela geralmente(uns 95% das vezes) é assinalada como retain(+1) evitando que quando for usado o comando release(-1) na propriedade por outras classe ela não seja removida da memória e gere erros no programa. Para um melhor entendimento do funcionamento do retain você pode olhar esse artigo da apple sobre gerencimento de memória.

//Declaração
@property(retain) ClasseObjota *joao;
//O que é realizado o set da propriedade
-(void)setJoao:(ClasseObjota *)obj {
    if (joao != obj) {
        [joao release];
        joao = [obj retain];
    }
}

copy: Quando a propriedade é assinalada com copy e o valor da propriedade for setado, o compilador irá criar uma cópia do objeto, criando assim mais um objeto alocado na memória.

//Declaração
@property(copy) ClasseObjota *joao;
//O que é realizado o set da propriedade
-(void)setJoao:(ClasseObjota *)obj {
    if (joao != obj) {
        [joao release];
        joao = [obj copy];
    }
}

nonatomic: Em uma aplicação multithread uma mesma variável pode ser chamada com o get e setada ao mesmo tempo, com isso o valor retornado não é garantido, pois o valor setado pode não está 100% copiado para o bloco de memória e esse valor ja ter sido recuperado no get, então esse valor retornado será "quebrado". Usando o nonatomic evitamos isso simplesmente copiando o valor em outro bloco e "renomeando" esse bloco quando terminado de copiar esse valor.

@property(nonatomic) ClasseObjota *joao;

Bem galera, então é basicamente isso o conteúdo sobre propriedades. Espero que tenham gostado da matéria!
Favor postar as dúvidas, críticas e elogios para melhor ainda mais os POST's. Até a próxima.

Posted by Pedro

Comentários (3) Trackbacks (1)
  1. Gostei muito do post, estou começando a estudar Objective C e foi de grande ajuda.
    Achei bem simples e direto …

  2. Obrigada! 😉

  3. Legal sobre o post parabéns!


Leave a comment