Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Dúvida - Aula 3.2 Reaproveitamento de Célula

Galera sou iniciante em Objective-C e nessa aula fiquei com uma dúvida/curiosidade gigantesca. Se eu escrever besteira por favor me corrijam rs

Temos 2 propriedades do tipo

@property NSMutableArray *contatos;

Uma em ViewController.h e outra em ListaContatosViewController.h

Sempre que clicamos no "+", chamamos o método exibeFormulario e o MutableArray contatos da ViewController.h é "zerado, limpo" Logo em seguida ele recebe todo o MutableArray contatos da ListaContatosViewController.h

Até ai tranquilo.

Quando preenchemos o formulário e chamamos o método "adiciona", populamos um objeto contato e jogamos ele no array da ViewController.h e voltamos pra Lista de contatos.

Quando clicamos no "+" novamente o array da Lista de contatos misteriosamente já está com o objeto que adicionamos no outro array (Que está ViewController.h) :O :O

A dúvida é: Em que momento o MutableArray *contatos da ListaContatosViewController.h está recebendo esses objetos que adicionamos???? rs Debbuguei e tudo mas está difícil entender.

Podem me ajudar por favor?

Abs

2 respostas
solução!

Adriano,

Quando iniciamos a aplicação, estamos olhando para a tela da ListaContatosViewController que possui oNSMutableArray.

Neste momento, na memória temos:

  • NSMutableArray de contatos
  • ListaContatosViewController com a referência para o array

Quando clicamos no "+" a lista continua na memória, só trocamos a apresentação da tela para o formulário.

Aí na memória fica:

  • NSMutableArray de contatos
  • ListaContatosViewController com a referência para o array
  • ViewController que recebe a mesma referência para o array de contatos através da linha: form.contatos = self.contatos do método exibeFormulario

Perceba que nesta atribuição a única coisa copiada é a referência para o objeto. O objeto mesmo continua sendo um só.

Quando a tela do formulário aparece e cadastramos o contato, é executado o método para adicionar o contato no array: [self.contatos addObject: contato].

Com isso, o ViewController vai adicionar um novo contato no array que ele possui a referência, que é o mesmo array referenciado pela lista.

Depois de adicionar, a memória agora possui:

  • NSMutableArray de contatos com um Contato que foi adicionado pelo formulário
  • ListaContatosViewController com a referência para o array
  • ViewController com a mesma referência para o array

Ao voltarmos para a lista, o array de contatos agora possui o contato novo adicionado. Se tentarmos adicionar um contato novamente, a lista passará a referência do array novamente para o formulário só que desta vez já com o contato lá dentro.

Tudo isso acontece porque o Objective-C está copiando a referência para o objeto e não duplicando o mesmo.

É como se tivéssemos duas pessoas segurando duas coleiras para o mesmo cachorro. Qualquer uma que for mexer com ele, estará mexendo no mesmo.

Espero que tenha ficado mais claro.

Abraço!

Caraca!!

Ficou sim, super claro.

Eu jurava que eram dois objetos NSMutableArray... duas coleiras e dois cachorros rs, esse esquema da referência é novo para mim. Muito bom!

Muito obrigado Joviane!

Abs