6 – Objectos – Parte 2

Como havia dito no post anterior, estou de volta com a continuação sobre Objetos. Mas como havia dito antes também, este assunto em Objective-C requer um conhecimento sobre a sintaxe, lógica de programação, e conceitos de P.O.O.  que ainda estão sendo explicados aqui. Mas podem ser consultados também na documentação que está disponível na página START.

Portanto, eu fiquei de falar sobre alguns assuntos, listados no primeiro post, 6 – Objetos – Parte 1, vou colocar a lista aqui novamente para que não haja dúvidas:

//Parte 1
– Variáveis e Ponteiros
– Métodos

//Parte 2
– Property
– Controladores de Fluxo
– Controladores de Repetição

//Parte 3
– Objetos

Então mãos a obra… Dúvidas, sugestões, críticas é só comentar abaixo!

Property

Quando se fala em property, falamos de um assunto que mexe com muitos outros itens importantes dentro do mundo de desenvolvimento para iOS.

Mas basicamente ainda estamos falando de variáveis. Então não há nada para se assustar. As maiores questões que são envolvidas nesse assunto serão tocados a seguir, e cada uma delas receberá um post explicando mais detalhes. Então podemos citar a preocupação com a segurança dos dados que trabalhamos, e também a gerencia de memória dentro da nossa app. Irei falar um pouco sobre a gerência de memória primeiro, e depois irei falar sobre a segurança de acesso aos dados.

Automatic Reference Count – ARC

Dentro do ambiente iOS, existe uma grande preocupação com o uso de memória, já que em temos de recurso, a memória é muito escassa em aparelhos mobile, como nos iPads, nos iPhones e iPods. Mas acredito que em alguns anos, talvez, veja bem, TALVEZ não seja uma grande questão. Entretanto ainda é necessário tomar muito cuidado para que sua App não venha a enfrentar problemas com falta de memória. Para ajudar nesta questão, a Apple criou o ARC (Automatic Reference Count), no caso um Contador de Referência Automático. Ele serve para gerenciar o uso da memória, e ajuda na limpeza da mesma quando o objeto ou variável que esteja nela não seja mais necessário.

Mas veja bem, ele é somente um interpretador do código e irá ajudá-lo a editar o código. Mas não funciona como um Garbage Colector como acontece com Java.

Em outro post vou me aprofundar mais sobre este assunto, por enquanto, vamos apenas ter ciência que existe uma ferramenta de ajuda para este tipo de assunto.

Acesso aos Dados

Em Obj-C, e em outras linguagens, existe uma preocupação com relação ao acesso aos dados guardados em uma variável. As propriedades, ou melhor property, é um modo de definir como será o acesso dos métodos ou objetos à variável.

Entendendo melhor:

Variáveis apontadas como property, recebem métodos, pré-configurados, que permitem fazer getter e setter em seu conteúdo. Para quem não está familiarizado com esses termos vou esclarecer:

getter => Significa LER, ou seja, ACESSAR O CONTEÚDO

setter => Significa DEFINIR, ou seja, ALTERAR O CONTEÚDO

Isso é um controle definido para agilizar a implementação do código, e permite um melhor controle, nos poupando também o tempo de definir os métodos setter’s e getter’s para cada variável que você criar, deixando isso a cargo do compilador.

Não que seja errado acessar diretamente um variável como no exemplo abaixo:

NSNumber *meuNumero = 42;

Mas no meio de um código muito grande, onde há muitas passagens de parâmetros nos métodos e até mesmo em métodos de outros objetos, pode ocorrer um erro de acesso proveniente de algum erro de digitação (em 99% dos casos erros de digitação do programador rsrs), então para garantir a segurança é usado o property para isso. Além de fornecer uma clareza maior do código, pois não será necessário uma grande quantidade de código escrito.

Declarando as Property’s ou Propriedades

Quando criamos uma classe, definimos suas variáveis (iVars). Essas variáveis podem ter acesso aberto para outras classes ou não. Nós definimos as variáveis que permitirão trocar dados com outros objeto no arquivo .h, ou seja, na interface da classe.

As variáveis são definidas após a linha onde temos o nome da classe e sua classe pai, dentro de chaves. Como no exemplo abaixo:

@interface Aviao : NSObject

{

    NSString *nomeComercialAeronave;
    NSString *modeloAreoNave;       //Declaração de variáveis privadas
    NSNumber *numeroDeTripulantes;
    float pesoTotalVazio, pesoTotalAbastecido;

}

-(void)enviarAvisoPassageiros;

@end

Neste exemplo declaramos 4 variáveis e um método.

Agora veja como iremos definir as propriedade de aviaoLotado:

@interface Aviao : NSObject
{

 NSString *nomeComercialAeronave;
 NSString *modeloAreoNave;                 //---> Declaração de variáveis privadas
 NSNumber *numeroDeTripulantes;
 float pesoTotalVazio, pesoTotalAbastecido;

}

@property (nonatomic) BOOL *aviaoLotado;       //---> Declaração de uma property visível para outros objetos
                                               //---> Acessível fora do escopo da classe

-(void)enviarAvisoPassageiros; //---> Declaraçaõ de um método que não recebe argumentos e não retorna valores (void)

@end

No exemplo acima, declaramos uma  propriedade , chamada de aviaoLotado, do tipo BOOL que representa uma variável privada. Além do @property também precisamos dizer os atributos que irão definir para o Xcode  os “limites” desse acesso à variável e a manipulação de memória para ele. Ou seja, quais operações estarão disponíveis e como a gerência de memória irá atuar sobre ela.

No exemplo nossa propriedade é nonatomic. Ou seja, ela pode ser acessada ao mesmo tempo por mais de uma thread (processo), não garantindo a integridade da informação, mas fazendo que nosso app funcione mais rápido, já que não será feita verificações de uso da property.

Esses atributos podem ser, como dito anteriormente, de controle de acesso ou de gestão de memória. Vejamos abaixo uma lista dos atributos de propriedades:

– Atomic (Padrão)
– Nonatomic
– Strong = Retain  (Padrão)
– Weak = unsafe_unretained
– Retain
– Assign  (Padrão)
– Unsafe_unretained
– Copy
– Readonly
– Readwrite  (Padrão)

Neste OUTRO POST você encontrará uma explicação detalhada sobre estes atributos que podem ser usados no momento que você cria uma propriedade. Os que estão marcados como padrão, não precisam ser usados no momento que é criada a property.

De uma forma geral uma propriedade é a maneira utilizada em Objective-C de dizer que uma determinada variável está acessível para outros objetos. E é através delas que poderemos trazer um dado para dentro de nosso objeto, e vice-versa. Uma variável criada dentro das chaves,  é uma variável privada e que somente poderá ser usada dentro do objeto.

Controladores de Fluxo

Em Objective-C temos os controladores de fluxo, que são herdados da linguagem C e funcionam da mesma maneira!

 Controlador IF, IF-ELSE, SWITCH-CASE

Em Obj-C controladores de fluxo funcionam exatamente como na linguagem C. Para resumir, irei mostrar um exemplo de código comentado, sendo para quem procura mais detalhes, poderá dar uma olhada na apostila de C que disponibilizei AQUI!

Controlador IF

Após declarar o if, devemos sempre colocar uma condição para ser avaliada. Quando uma condição é VERDADEIRA, o if permite que as instruções que estiverem dentro do seu escopo ( dentro das chaves { }) sejam executados. Caso a condição seja falsa, ele pula a execução do bloco e executa a próxima instrução.

Esboço da função:

if(condição){
//bloco de código;
}

 

Exemplo prático:


int idade = 23;

if (idade > 18){

NSLog(@"Acesso liberado.");

}

Neste exemplo, criamos uma variável chamada idade, e atribuímos a ela o valor 23. Após declarar o if, verificamos se a condição de comparação com um outro valor é verdadeira. Como idade (23) é maior que 18, então será escrito no console do debug  a frase: “Acesso liberado.”. Caso o valor de idade fosse menor que 18, então o programa não iria escrever nada no console e sua execução continuaria para a próxima instrução fora do escopo do if.

Controlador IF-ELSE

Funciona da mesma forma como IF porém recebe mais um termo para ajudar no controle do fluxo com uma alternativa.

if(condição){

// Bloco de codigo caso a condição seja verdadeira

}else{

// Bloco de codigo caso a condição seja falsa

}

Exemplo prático:

int nivelDaAgua = 200;

if(nivelDaAgura >100){

NSLog(@"Abrir escotilha para transbordo.");

} else{

NSLog@("Fechar escotilha.");

}

Neste exemplo quando o nivel da agua é superior a 1000 é emitida a seguinte mensagem:””Abrir escotilha para transbordo.”, mas caso o valor seja abaixo ele emitira a seguinte mensagem:”Fechar escotilha.”. A vantagem de usar o if-else, é que podemos determinar uma segunda tarefa,  sem ter que fazer manualmente 2 verificações, bastando somente uma para verificar a condição de execução.

Você pode fazer o uso ANINHADO destas funções (if e if-else), bastando tomar muito cuidado com a lógica envolvida, para obter o resultado desejado.

Exemplo:

bool pinturaDeParede = YES;

bool pinturaComFalhas = YES;

if(pinturaDeParede){

NSLog(@"Pintura de parede completa!");

if(paredeComFalhas){

NSLog(@"Pintar novamente!");

}

}else{

NSLog(@"Pintura ainda não terminou");

}

No exemplo acima criamos duas variáveis do tipo boleana, e atribuimos o valor YES, que em Objective-C significa VERDADEIRO.
No if é feita a verificação do variável pinturaDeParede, como é verdadeira é executado o bloco do if. Dentro do if existe outro que verifica se há falhas na pintura, como o valor da variável paredeComFalhas, também é verdadeiro, ele irá executar o bloco dentro do if interno e pular para a próxima instrução, fora do escopo deste if, e ignorando a instrução que está dentro do else.

Caso o segundo if ( o if mais interno) fosse FALSE então ele iria somente executar a mensagem “Pintura de parede completa!” e iria também ignorar o else e executar a próxima instrução depois do primeiro if, ou seja, o if mais externo.

Caso o if externo seja false, então ele irá executar o conteúdo de else. Informando a seguinte mensagem: “Pintar novamente!”

Não é boa prática de programação usar muitos if e if-else aninhados, além de tornar a compreensão difícil, irá deixar a leitura do código suja. Caso você tenha muitas alternativas para alguma condição é preferível usar o SWITCH-CASE.

Controlador Switch-Case

O switch-case funciona exatamente como na Linguagem C. Abaixo darei uma breve explicação.

O switch funciona como um if, fazendo uma verificação, mas em vez de uma verificação boleana, ele faz uma verificação do valor, e compara com os casos, se uma condição for igual a um dos casos, ele irá executar o bloco dentro do caso respectivo.

Exemplo:


int distancia= 100;

switch(distancia){

case 5: NSLog(@"Muito perto!");
                  break;

case 10  : NSLog(@"Perto!");
                  break;

case 100  : NSLog(@"Distante!");
                  break;

case 155: NSLog(@"Muito distante!");
                  break;

default: NSLog(@"Distancia indeterminada!");

}

Saida no Console: Distante!

No exemplo acima, o termo break; para a busca dentro do switch e passa para a execução da próxima instrução. O termo default, serve para realizar uma ação caso o valor de um case, não corresponda a um valor avaliado na condição.

Switch’s podem ser aninhados, sendo o novo switch uma alternativa em um dos cases, como no exemplo abaixo:


int distancia= 100;
int dica = 50;

switch(distancia){

case 5: NSLog(@"Muito perto!");
                  break;

case 10  : NSLog(@"Perto!");
                  break;

case 100  : NSLog(@"Distante!");

                     switch(dica){
                           case 10: NSLog(@"Acho que você está perdido!");
                                  break;

                           case 50: NSLog(@"Mas você está chegando lá!");
                                  break;</pre>
                           default: NSLog(@"Mas não podemos a precisão da distancia");
                           }
                               break; // Break necessário para interromper após o switch interno.
<pre>case 155: NSLog(@"Muito distante!");
                  break;

default: NSLog(@"Distancia indeterminada!");

}

Saida no console: Distante! Mas você está chegando lá!

Você pode testar as demais alternativas, trocando os valores das variáveis distancia e dica. Note que após fechar o switch interno, é necessário por o break para interromper a execução.

Existem detalhes que são importantes para o uso correto destes controladores de fluxo! E eles podem ser aprendidos na própria Linguagem C.

Controladores de Repetição

Em Obj-C controladores de repetição (looping) funcionam exatamente como na linguagem C. Para resumir, irei mostrar um exemplo de código comentado, para quem procura mais detalhes, poderá dar uma olhada na apostila de C que disponibilizei AQUI!

Neste ponto iremos tratar sobre os loopings  FOR, WHILE, DO-WHILE e FOR-IN.

Controlador de Repetição While

Escolhi tratar sobre este primeiro pois é o mais fácil e que dará um entendimento rápido para aqueles que estão vendo sobre este assunto pela primeira vez.

A função While realiza uma operação, ou várias operações dentro do seu escopo enquanto alguma condição for verdadeira. Por exemplo:

Estrutura da Função:

while (condição){

// Executa um bloco de código.

}

Seu funcionamento é parecido com o do IF, porém ele irá executar as tarefas repetidamente enquanto a condição for verdadeira, no momento em que ela se tornar falsa, ele para de executa-las e passa a execução para a instrução seguinte. Porém é necessário que exista uma variável que sirva como uma “chave” de liga e desliga.

Exemplo prático:

int chave = 0;

while(chave < 5){  // Lê-se: 'chave'  menor que 5

NSLog (@"Contando: %d", chave);

chave = chave +1;

}

Saida no console:
Contando: 0
Contando: 1
Contando: 2
Contando: 3
Contando: 4

Enquanto o valor de chave for menor que 5, será impresso uma mensagem na tela com um número no final, esse numero é o estado atual da chave enquanto ocorre a execução do while.  Notem que o valor impresso na ultima linha é 4, pois como o valor da chave é igual a 5 a condição de que ele seja menor  que 5 não será mais verdadeira, e o looping é encerrado.

Caso a a verificação de condição fosse:

while (chave <= 5) // Lê-se: ' chave' menor que OU igual a '5'

Então a ultima linha seria

Contando: 0
Contando: 1
Contando: 2
Contando: 3
Contando: 4
Contando: 5

Essa é a lógica básica que você encontrará nos demais looping’s! Vamos ver agora como funciona os demais.

Controlador de Repetição Do-While

Enquanto o while primeiro verifica a condição e depois decide se executa ou não o bloco, o do-while faz o inverso, ele executa o código e depois verifica se a condição ainda é verdadeira ou não antes de executar novamente o bloco de código.

Estrutura da função:

 do { // Executa bloco do código; }while(condição); 

Então vamos a um teste prático:

 int chave = 0; do { NSLog(@"%d); chave = chave+1; }while(chave<0);

Saida no console: 0 A saída deste código no console somente será 0 (zero), pois como eu disse, o do-while  vai executar  a primeira vez o código e depois verifica se a condição ainda é verdadeira, como no meio do bloco nós modificamos o valor de chave para 1, a condição se torna falsa e o looping é encerrado.

Controlador de looping For

O for é o mais conhecido e as vezes temido pela galera, talvez devido a sua versatilidade e ao seu poder de controle! Mas depois desta explicação o Grande Leão não passará de um gatinho faminto, pedindo um pouco de leite. 😀

FOR depois da explicação! :D

FOR depois da explicação! 😀

Primeiro precisamos entender como é a estrutura do FOR, abaixo podemos ler essa explicação:

Estrutura da função:


for(declaração_da_chave_de_incremento ; verificação_da_condição ; incremento_ou_decremento_da_chave)
{
  // Bloco de código
}

O for, possui a entrada de 3 parâmetros, com os nomes auto-descritivos acima. Detalhando a explicação:

declaração_da_chave_de_controle : Neste campo criamos uma variável que conterá um valor inteiro, que será usado no teste de condição.

verificação_da_condição: Assim como while e do-while, é feito um teste de condição com alguma chave, previamente declarada.

incremento_ou_decremento_da_chave: Enquanto no while e no do-while, a modificação da chave é feita dentro do bloco do código, em for, isso pode ser feito em forma de argumento. Não obrigando a modificação da chave ao decorrer da execução. Onde podemos usar o operador de incremento (++) ou decremento( — ).

Breve explicação sobre operadores de incremento e decremento:

São os sinais de adição e subtração em pares para indicar que a variável será acrescida em +1 ou menos 1. Abaixo um exemplo prático:

int numeroParaIncremento = 0;

numeroParaIncremento++;

NSLog(@"%d", numeroParaIncremento);

Saída no console: 1

O mesmo pode ser feito para decrementar um valor em 1:

int numeroParaDecremento = 10;
numeroParaDecremento--;

NSLog(@"%d", numeroParaDecremento);

Saida no Console: 9

Então aqui encerramos nossa explicação sobre operadores de incremento e decremento, para mais detalhes consulte a Apostila de Linguagem C.

Voltando a explicação sobre FOR.

Então como dizia, o for recebe 3 argumentos e segue a seguinte lógica de atuação:

1º – Recebe uma variável chave;
2º – Verifica Condição de Execução;
3º – Caso seja Verdadeira ele executa o código;
4º – Após executar o código no bloco, ele executa a operação de incremento ou decremento ;
5º – Verifica novamente a condição para nova execução, caso a condição seja verdadeira ele executa novamente o bloco de código, caso falsa o programa passa para a próxima função.

Exemplo prático:

for (int chave = 0; chave<10; chave++)
{

NSLog(@"Valor da chave: %d",chave);

}

Saida no console:

2014-09-06 13:08:25.617 TesteComLoop[1198:60b]  0
2014-09-06 13:08:25.619 TesteComLoop[1198:60b]  1
2014-09-06 13:08:25.619 TesteComLoop[1198:60b]  2
2014-09-06 13:08:25.620 TesteComLoop[1198:60b]  3
2014-09-06 13:08:25.620 TesteComLoop[1198:60b]  4
2014-09-06 13:08:25.621 TesteComLoop[1198:60b]  5
2014-09-06 13:08:25.621 TesteComLoop[1198:60b]  6
2014-09-06 13:08:25.622 TesteComLoop[1198:60b]  7
2014-09-06 13:08:25.622 TesteComLoop[1198:60b]  8
2014-09-06 13:08:25.623 TesteComLoop[1198:60b]  9

O valor final não será 10 pois este valor já será igual ao valor de comparação, como já explicado no caso do while, e a mesma regra vale para todos os loop’s apresentados.

Existem considerações que acho importante a fazer sobre o for:

Looping infinito:

Caso você não faça a inserção dos argumentos desta função, ele será um looping infinito. Portanto, tenho cuidado com o que deseja!

Exemplo:

for( ; ; )
{
NSLog(@"Será escrito infinitamente! ");
}

Interagir com a chave do looping:

Você pode interagir com a chave do looping dentro do escopo (no bloco de código do for) do for, mas eu não indico isso. Use outra variável para fazer algumas operações. Veja o exemplo abaixo para entender melhor


for (int chave = 0; chave<10; chave++) {

NSLog(@"%d",chave);

chave -= 5;
}

Enquanto o for incrementa em +1 o valor da chave, no bloco do código você vai ter um decremento de -5 no valor, tornando impossível encerrar o looping e travando seu futuro app. Então tome muito cuidado ao mudar o valor da variável de controle.

Usar variável externa para controle do for:

Sim você pode usar uma variável declarada antes do for para o controle de fluxo, pode ser uma variável global ou outra que seja visível a função, e deixando o campo de declarar a chave no for vazia, veja o exemplo abaixo:

int chave = 0;

for (  ; chave<10; chave++) {

NSLog(@"%d",chave);
}

O resultado final será o mesmo, porém tome o cuidado ao interagir sobre essa variável, pois poderá desencadear um erro muito grande caso venha a alterar o valor dela durante a execução do for, ou deixa-la com um valor que causará um erro de lógica impossibilitando o for de ser executado corretamente ou de maneira esperada. Por exemplo, alterar o valor da chave para acima de 10 antes de iniciar a iteração do for.

Bom, aqui encerramos a explicação sobre o FOR. Ainda há detalhes que podem ser ignorados aqui, pois o objetivo aqui é que você possa realizar tarefas simples e entender o funcionamento básico antes de se aventurar a atividades mais complexas.

Controlador de looping FOR – IN

Este controlador de fluxo é criado para facilitar a vida do programador ao enumerar ou listar o conteúdo de uma variável, por exemplo: NSArray, ou mesmo um NSDictionary. Ainda darei suporte para explicar sobre essas Classes, mas no momento você poderá buscar no Google sobre elas!

Como funciona o FOR-IN:

O for in de modo parecido com o for tradicional. Vamos dar uma olhada em sua estrutura para melhor entendimento:

for ( variável_recebe_conteúdo in variável_percorrida)
{
//Bloco de código
}

Diferente do for tradicional, não precisamos declarar a variável de chave de controle, e nem a quantidade de vezes que o for precisará ser executado ou mesmo criar o incremento ou decremento da chave de controle, precisamos somente declarar uma variável que receberá os valores de um array ou de um dicionário e depois da palavra reservara “in” dizer qual será o array ou dicionário que será “lido”.

variável_que_recebe_conteúdo: Esta variável armazenara um valor de uma posição diferente do array ou do dicionário a cada iteração do looping.

variável_percorrida: Está será a variável a qual você quer listar o conteúdo.

Exemplo prático:

// Criamos um array contendo valores do tipo string, mas você pode guardar outros valores se quiser.
NSArray* arrayComValores = [NSArray arrayWithObjects:@"valor na posição 0 (zero)",@"valor na posição 1",@"outro valor", nil];

// Sabendo que os valores contidos no array são do tipo string, criaremos um variável do tipo NSString, para salvar estes valores.
for (NSString* variavelComValores in arrayComValores) {

NSLog(@"%@",variavelComValores); // A cada iteração do looping, o valor de variavelComValores será
// alterado e impresso no console.
}

Saida no console:

2014-09-06 14:13:37.207 TesteComLoop[1290:60b] valor na posição 0 (zero)
2014-09-06 14:13:37.208 TesteComLoop[1290:60b] valor na posição 1
2014-09-06 14:13:37.209 TesteComLoop[1290:60b] outro valor

O mesmo pode ser feito usando NSDictionary no lugar de NSArray. Observe o exemplo abaixo:

NSDictionary* dicionario = [[NSDictionary alloc]init]; // Criando um dicionario

// "CHAVE" : "VALOR"
dicionario = @{@"Chave":@"Valor",@"nome":@"Tiago",@"idade":@"28"}; // Inserindo uma Chave e um Valor para a Chave

for (NSString* valores in dicionario) {         // Percorrendo o dicionario.

NSLog(@"Valores no dicionario: %@.", valores);

}

Saida no Console:

2014-09-06 14:28:34.426 TesteComLoop[1371:60b] Valores no dicionario: Chave.
2014-09-06 14:28:34.428 TesteComLoop[1371:60b] Valores no dicionario: idade.
2014-09-06 14:28:34.429 TesteComLoop[1371:60b] Valores no dicionario: nome.

Deste modo conseguiremos listar as CHAVES do que estão contidas no dicionário. Para ter acesso ao VALOR é necessário enviar a mensagem allValues para o objeto dicionário. Veja como fica agora:

 NSDictionary* dicionario = [[NSDictionary alloc]init]; // Criando um dicionario</pre>
<pre>// "CHAVE" : "VALOR"</pre>
<pre>   dicionario = @{@"Chave":@"Valor",@"nome":@"Tiago",@"idade":@"28"}; // Inserindo uma Chave e um Valor para a Chave

    for (NSString* valores in [dicionario allValues]) {  // Uso do método allValues para retornar somente os valores!

        NSLog(@"Valores no dicionario: %@.", valores);
}

Saida no console:

2014-09-06 14:28:34.429 TesteComLoop[1371:60b] Valores no dicionario: Valor.
2014-09-06 14:28:34.430 TesteComLoop[1371:60b] Valores no dicionario: 28.
2014-09-06 14:28:34.431 TesteComLoop[1371:60b] Valores no dicionario: Tiago.

Bom, acredito que com este conhecimento já seja necessário entender muita coisa da Linguagem Objective-C!!

Caso tenha algum erro neste artigo, sinta-se livre para me informar e sugerir a correção!!  Ajudas e críticas são sempre bem vindas!

Nosso próximo tutorial teremos a terceira parte deste documento, falando sobre Objetos!! E assim finalizando o assunto Programação Orientada Objetos em Objective C!!

Não deixe de comentar e curtir nossa página no Facebook! Sua opinião é muito importante para nós!!

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s