WEBVTT

00:00:00.000 --> 00:00:01.680
>> Sintonize a esta semana
Xamarin Show onde

00:00:01.680 --> 00:00:03.360
meu bom amigo Alexi em falar

00:00:03.360 --> 00:00:06.810
sobre o gerenciamento de memória para
suas aplicações. Então sintonize.

00:00:06.810 --> 00:00:13.200
[MÚSICA]

00:00:13.200 --> 00:00:14.280
>> Bem-vindo de volta, a todos,

00:00:14.280 --> 00:00:15.405
ao The Xamarin Show.

00:00:15.405 --> 00:00:16.650
Sou seu apresentador James Montemagno.

00:00:16.650 --> 00:00:17.820
Hoje, meu melhor amigo em

00:00:17.820 --> 00:00:21.270
o mundo inteiro Alexi com
Me. Como está indo, amigo?

00:00:21.270 --> 00:00:22.905
>> Estou bem. E quanto a você?

00:00:22.905 --> 00:00:24.960
>> Estou fazendo fantástico.
É um dia lindo.

00:00:24.960 --> 00:00:26.640
aqui em Redmond, Washington todos os dias.

00:00:26.640 --> 00:00:27.325
>> É.

00:00:27.325 --> 00:00:29.085
>> Agora, você é do nosso celular

00:00:29.085 --> 00:00:31.065
assessoria ao cliente
equipe, isso é correto?

00:00:31.065 --> 00:00:31.920
>> Isso está correto.

00:00:31.920 --> 00:00:33.450
>> Então, o que isso significa?

00:00:33.450 --> 00:00:35.370
>> Isso significa que trabalhamos com

00:00:35.370 --> 00:00:38.250
nossos clientes e nós
aconselhá-los, obviamente.

00:00:38.250 --> 00:00:41.645
Mas, principalmente, trabalhamos com desenvolvedores
e ver como eles usam ferramentas,

00:00:41.645 --> 00:00:44.300
como eles trabalham com a nossa ferramenta Xamarin,

00:00:44.300 --> 00:00:47.560
e quais são os comuns
armadilhas que enfrentam com.

00:00:47.560 --> 00:00:48.420
>> Perfeito.

00:00:48.420 --> 00:00:50.205
>> Hoje, eu quero falar sobre

00:00:50.205 --> 00:00:52.355
um deles é o gerenciamento da memória.

00:00:52.355 --> 00:00:53.780
>> Tenho você. Sim. É muito importante.

00:00:53.780 --> 00:00:55.730
porque muitas vezes falamos
sobre todo o cool,

00:00:55.730 --> 00:00:57.155
características extravagantes que você pode fazer,

00:00:57.155 --> 00:01:00.440
mas queríamos ter isso.
série de melhores práticas

00:01:00.440 --> 00:01:02.340
porque você se depara com problemas.

00:01:02.340 --> 00:01:03.820
É o que acontece. É tão fácil de fazer.

00:01:03.820 --> 00:01:06.345
Gerenciamento de memória,
honestamente, eu sou um noob.

00:01:06.345 --> 00:01:07.770
Eu realmente não sei. Eu sou como,

00:01:07.770 --> 00:01:09.560
"Eles vão matar
meu aplicativo em cinco segundos.

00:01:09.560 --> 00:01:11.705
Não importa, certo? Mas
Eu não deveria pensar assim.

00:01:11.705 --> 00:01:14.210
>> Isso é verdade. Isso é o que vemos.

00:01:14.210 --> 00:01:16.850
porque ninguém se importa com
o gerenciamento da memória.

00:01:16.850 --> 00:01:21.300
Temos tanta memória.
e você nunca vê-los.

00:01:21.300 --> 00:01:24.750
Quando foi a última vez que você foi
verificado o uso da memória do aplicativo?

00:01:24.750 --> 00:01:26.250
>> A última vez que tive um acidente.

00:01:26.250 --> 00:01:29.510
Na verdade, eu tinha um muito
bom exemplo disso.

00:01:29.510 --> 00:01:31.910
Eu vou te dizer isso. Este
é exemplo do mundo real.

00:01:31.910 --> 00:01:35.120
Eu tenho um bug em Xamarin Essentials

00:01:35.120 --> 00:01:38.375
que diz quando eu chamo
este método 20.000 vezes,

00:01:38.375 --> 00:01:41.570
meu aplicativo trava e ele
foi porque eu não era

00:01:41.570 --> 00:01:45.155
eliminação adequada de um
objeto android nativo,

00:01:45.155 --> 00:01:46.775
uma janela, uma exposição.

00:01:46.775 --> 00:01:48.170
Então o que está acontecendo é,

00:01:48.170 --> 00:01:50.480
Eu continuaria criando
e nunca iria ficar

00:01:50.480 --> 00:01:53.135
lixo coletado sempre porque
Nunca me demiti.

00:01:53.135 --> 00:01:54.890
>> Isso é o que estamos indo
para falar sobre hoje.

00:01:54.890 --> 00:01:56.925
>> Sim. Incrível. Vamos fazer.
É isso. O que você tem para nós?

00:01:56.925 --> 00:02:00.435
>> Então temos este pequeno
aplicativo simples com duas janelas,

00:02:00.435 --> 00:02:02.745
tela principal e tela de detalhes.

00:02:02.745 --> 00:02:06.375
Esse é um padrão muito comum.
Controlador de navegação da ui.

00:02:06.375 --> 00:02:09.600
Este é um Xamarin simples
aplicativo para iOS, certo?

00:02:09.600 --> 00:02:10.305
>> Ok.

00:02:10.305 --> 00:02:12.440
>> O que estamos indo
fazer é introduzir

00:02:12.440 --> 00:02:14.930
vazamentos de memória em muitos,
muitas maneiras diferentes.

00:02:14.930 --> 00:02:19.025
Mas primeiro, eu quero falar sobre
as diferenças do mundo nativo

00:02:19.025 --> 00:02:23.960
e mundo gerido
desempenho e memória.

00:02:23.960 --> 00:02:25.340
Então, sempre que você tem um processo,

00:02:25.340 --> 00:02:27.995
doação do sistema operacional
você um pedaço de memória.

00:02:27.995 --> 00:02:31.370
Você deve estar ciente sobre isso
porque uma vez que você ficar sem memória,

00:02:31.370 --> 00:02:33.670
seu aplicativo trava ou
sistema operacional mata-lo.

00:02:33.670 --> 00:02:35.355
Na memória gerenciada,

00:02:35.355 --> 00:02:40.260
nosso Xamarin Mono recebendo estes
pequeno pedaço desta memória.

00:02:40.260 --> 00:02:41.630
É quando deveríamos estar.

00:02:41.630 --> 00:02:43.670
cauteloso sobre como nós
use essa peça também.

00:02:43.670 --> 00:02:44.030
>> Ok.

00:02:44.030 --> 00:02:46.640
>> Então você ainda deve ser
ciente sobre a memória nativa,

00:02:46.640 --> 00:02:48.905
e agora uma vez que você trabalha com Xamarin,

00:02:48.905 --> 00:02:50.320
também ciente sobre a parte de gestão.

00:02:50.320 --> 00:02:52.740
>> Entendi. Então você tem
memória nativa, iOS,

00:02:52.740 --> 00:02:55.980
Android bits e peças,
.NET conseguiu memória?

00:02:55.980 --> 00:02:56.640
>> É isso mesmo.

00:02:56.640 --> 00:02:57.090
>> Perfeito.

00:02:57.090 --> 00:03:00.530
>> Sempre que você cria um objeto
e você cria, digamos,

00:03:00.530 --> 00:03:02.330
um botão de ui, você realmente criar

00:03:02.330 --> 00:03:04.950
um botão de ida nativo e
aula de botão de ida gerenciada.

00:03:04.950 --> 00:03:06.680
Eles têm impacto de memória diferente.

00:03:06.680 --> 00:03:10.310
Eles poderiam causar diferente
problemas de memória, porque há

00:03:10.310 --> 00:03:14.135
também uma maneira nativa de coletar
lixo e maneira gerenciada.

00:03:14.135 --> 00:03:20.385
Em Mono, usamos mono único
coletor de lixo de geração.

00:03:20.385 --> 00:03:23.460
No mundo nativo, o iOS usa a ARC,

00:03:23.460 --> 00:03:26.680
Android usar o seu próprio
coletor de lixo,

00:03:26.680 --> 00:03:29.420
mas eles devem trabalhar juntos
lado a lado e devemos

00:03:29.420 --> 00:03:32.300
tê-los, porque você pode
introduzir problemas usando isso.

00:03:32.300 --> 00:03:32.690
>> Entendi.

00:03:32.690 --> 00:03:34.640
>> Então, o primeiro e

00:03:34.640 --> 00:03:36.950
a abordagem mais simples para introduzir

00:03:36.950 --> 00:03:40.830
um problema de memória é uma assinatura
sem a desassinatura.

00:03:42.040 --> 00:03:45.680
Coletor de lixo deve saber
quando há um lixo.

00:03:45.680 --> 00:03:47.180
Mas como ele poderia saber?

00:03:47.180 --> 00:03:49.565
Ele deve ser capaz de construir

00:03:49.565 --> 00:03:53.915
um gráfico de árvore de acessibilidade
e começa a partir de rotas.

00:03:53.915 --> 00:03:57.320
Nossos eventos estáticos, variáveis estáticas,

00:03:57.320 --> 00:03:59.350
eventos estáticos ou chamadas de rolagem de thread,

00:03:59.350 --> 00:04:01.910
são todas rotas acessíveis e

00:04:01.910 --> 00:04:05.005
deleites do coletor de lixo
eles como não lixo.

00:04:05.005 --> 00:04:06.810
Então, sempre que você se inscrever assim,

00:04:06.810 --> 00:04:09.560
vamos tomar plugin conectividade.

00:04:09.560 --> 00:04:11.960
Eu sei, James, você é
familiarizado com este plugin.

00:04:11.960 --> 00:04:13.400
>> Eu sou. Sim. Muito mesmo.

00:04:13.400 --> 00:04:14.960
Eu gosto disso. Em
aqui, nós somos apenas o quê?

00:04:14.960 --> 00:04:16.220
Assinando um evento,

00:04:16.220 --> 00:04:18.610
e poderia ser qualquer
eventos como evento de cliques,

00:04:18.610 --> 00:04:20.360
você tem um evento de mudança de sensor.

00:04:20.360 --> 00:04:22.715
Basicamente, qualquer coisa em .NET.

00:04:22.715 --> 00:04:25.970
>> Sim. É específico.
não só para Xamarin.

00:04:25.970 --> 00:04:27.830
É qualquer evento estático

00:04:27.830 --> 00:04:31.745
em .NET e conectividade
aqui está apenas um exemplo.

00:04:31.745 --> 00:04:35.390
O que estou tentando dizer,
pode ser qualquer evento estático ou

00:04:35.390 --> 00:04:38.960
qualquer singleton desde evento.

00:04:38.960 --> 00:04:40.880
Então, sempre que subscrevemos assim,

00:04:40.880 --> 00:04:42.520
e digamos que temos

00:04:42.520 --> 00:04:47.100
este pequeno pedaço de
Manipulador connectivityChanged.

00:04:47.100 --> 00:04:49.655
Nós introduzimos um pequeno vazamento de memória.

00:04:49.655 --> 00:04:54.290
É pequeno porque a nossa visão é
muito simples e leve,

00:04:54.290 --> 00:04:55.400
Mas é um vazamento de memória.

00:04:55.400 --> 00:04:57.685
>> Então é um vazamento de memória, por que embora?

00:04:57.685 --> 00:05:00.860
>> Porque essa conectividade e

00:05:00.860 --> 00:05:03.830
Evento conectividade alterado
é uma referência estática

00:05:03.830 --> 00:05:05.270
para o nosso coletor de lixo.

00:05:05.270 --> 00:05:06.980
Uma vez o nosso lixo
colecionador está tentando

00:05:06.980 --> 00:05:08.810
identificar se é um lixo ou não,

00:05:08.810 --> 00:05:11.015
não é porque

00:05:11.015 --> 00:05:14.540
ConectividadeMudou evento tem
uma referência a este manipulador,

00:05:14.540 --> 00:05:17.375
e este manipulador realmente lida

00:05:17.375 --> 00:05:21.080
a referência à nossa
DetailsViewController.

00:05:21.080 --> 00:05:24.680
>> Eu vejo. Peguei. Então, nós temos
criou este evento dentro de

00:05:24.680 --> 00:05:29.600
este ViewController e eu
inscrito, mas nunca desinscrito.

00:05:29.600 --> 00:05:31.970
Então sempre tem isso.
referência imediatamente.

00:05:31.970 --> 00:05:34.940
Então, os coletores de lixo diz:
"Ei, o que está disponível?"

00:05:34.940 --> 00:05:37.030
Diz: "Você não pode ter isso".

00:05:37.030 --> 00:05:38.205
>> Isso está correto.

00:05:38.205 --> 00:05:40.580
>> Eu quero ter certeza de que
que está correto porque eu

00:05:40.580 --> 00:05:42.185
acredito que é assim
Funciona na minha mente.

00:05:42.185 --> 00:05:43.150
Quero ter certeza de que estou certo.

00:05:43.150 --> 00:05:47.225
>> A única tarefa de coletor de lixo
faz é desalocar a memória,

00:05:47.225 --> 00:05:48.605
e fazer isso corretamente,

00:05:48.605 --> 00:05:50.540
coletor de lixo deve saber como

00:05:50.540 --> 00:05:52.730
identificar corretamente se
É lixo ou não.

00:05:52.730 --> 00:05:53.180
>> Entendi.

00:05:53.180 --> 00:05:55.790
>> Então, para construir uma árvore de acessibilidade,

00:05:55.790 --> 00:05:59.270
um coletor de lixo
usa rotas estáticas ou

00:05:59.270 --> 00:06:01.430
apenas rotas e eventos estáticos

00:06:01.430 --> 00:06:03.500
ou qualquer propriedade estática
como um dos percursos.

00:06:03.500 --> 00:06:06.460
Também variáveis locais,
um monte de outras coisas.

00:06:06.460 --> 00:06:07.020
>> Entendi.

00:06:07.020 --> 00:06:11.820
>> Então deixe-me executá-lo
e mostrar como funciona.

00:06:11.820 --> 00:06:14.745
Você acha que nós vamos
ver alguma diferença?

00:06:14.745 --> 00:06:17.540
>> Eu não sei. Eu quero dizer
espero que não porque

00:06:17.540 --> 00:06:20.090
É tão simples é o que estou pensando.

00:06:20.090 --> 00:06:22.160
Agora, meu medo, porém, é que

00:06:22.160 --> 00:06:24.200
desde que estamos registrando mais
e uma e outra vez,

00:06:24.200 --> 00:06:26.750
se mudarmos os eventos,

00:06:26.750 --> 00:06:28.850
provavelmente estamos recebendo
em muitos eventos.

00:06:28.850 --> 00:06:30.635
>> Sim. Vamos verificar isso.

00:06:30.635 --> 00:06:33.560
Então eu me mudei para a página de detalhes.

00:06:33.560 --> 00:06:36.185
Vou desligar meu Wi-Fi agora.

00:06:36.185 --> 00:06:38.510
>> Aqui, estamos usando
o simulador iOS.

00:06:38.510 --> 00:06:41.975
Então, ele está realmente usando
a Internet da máquina.

00:06:41.975 --> 00:06:46.460
>> Sim. Acabamos de ter um evento aqui.
que são conectividadechanged.

00:06:46.460 --> 00:06:51.910
Vamos voltar algumas vezes.
e mais algumas vezes,

00:06:51.910 --> 00:06:54.630
e estou de volta na página principal.

00:06:54.630 --> 00:06:58.215
Eu não sou delicado em
qualquer coisa agora,

00:06:58.215 --> 00:07:01.280
e presumo que os meus detalhes
página não estão mais lá, certo?

00:07:01.280 --> 00:07:01.430
>> Sim.

00:07:01.430 --> 00:07:02.810
>> Meu manipulador de assinatura

00:07:02.810 --> 00:07:04.805
não deve funcionar porque
Eu não fiz nada.

00:07:04.805 --> 00:07:07.015
Vamos ligar o Wi-Fi.

00:07:07.015 --> 00:07:09.510
>> Ok. Então, nós realmente criado

00:07:09.510 --> 00:07:11.910
essa conectividade mudou
na segunda página.

00:07:11.910 --> 00:07:12.420
>> Segunda página.

00:07:12.420 --> 00:07:13.665
>> Bem, eu estou na primeira página.

00:07:13.665 --> 00:07:17.440
>> Sim. Portanto, não esperamos
nosso manipulador para trabalhar,

00:07:17.440 --> 00:07:18.645
Mas olha o que temos.

00:07:18.645 --> 00:07:21.090
Acabamos de ter quatro manipuladores.
executando nosso código,

00:07:21.090 --> 00:07:23.600
e poderia ser qualquer
banco de dados de atualização de código,

00:07:23.600 --> 00:07:25.505
salvar as configurações, o que quer.

00:07:25.505 --> 00:07:28.070
A questão aqui não só
com gerenciamento de memória

00:07:28.070 --> 00:07:30.635
porque é preciso alguma memória.

00:07:30.635 --> 00:07:34.970
É também um problema, porque temos
algum código a ser executado também.

00:07:34.970 --> 00:07:37.445
>> Então isso significa
que a página de detalhes,

00:07:37.445 --> 00:07:39.350
agora nunca pode ser
lixo coletado?

00:07:39.350 --> 00:07:42.455
Então, agora eu só tenho isso
Página de detalhes sempre na memória.

00:07:42.455 --> 00:07:43.400
>> Infelizmente, sim.

00:07:43.400 --> 00:07:44.660
>> Oh meu Deus, isso é ruim.

00:07:44.660 --> 00:07:47.385
>> Isso é ruim. Como desenvolvedor,

00:07:47.385 --> 00:07:49.560
nem sempre vemos isso.

00:07:49.560 --> 00:07:54.280
Como usuário, vejo meu aplicativo falhar
uma vez por semana, o que for.

00:07:54.280 --> 00:07:56.675
Vou reiniciá-lo.
e continuar a usá-lo.

00:07:56.675 --> 00:07:58.220
É por isso que não é relatado,

00:07:58.220 --> 00:08:00.350
não é levado muito a sério,

00:08:00.350 --> 00:08:03.950
mas é um problema, especialmente se você

00:08:03.950 --> 00:08:08.330
obter uma imagem enorme lá
o que afeta sua memória.

00:08:08.330 --> 00:08:10.910
Então, eu vou não comentar
esta linha de código,

00:08:10.910 --> 00:08:14.680
que realmente adiciona alguma carga de memória

00:08:14.680 --> 00:08:19.740
aqui e está carregando um
imagem da Internet.

00:08:19.740 --> 00:08:22.265
Estamos apenas tirando uma imagem aleatória.

00:08:22.265 --> 00:08:24.815
Deixe-me mostrar que é realmente aleatório.

00:08:24.815 --> 00:08:27.035
Vamos ver o que temos aqui.

00:08:27.035 --> 00:08:29.510
Estou sempre preocupado com isso.

00:08:29.510 --> 00:08:32.210
OKEY. Então temos essa imagem aleatória,

00:08:32.210 --> 00:08:34.370
e é isso que somos.
vai carregar em

00:08:34.370 --> 00:08:37.190
nosso aplicativo toda vez que nós
entre na página de detalhes.

00:08:37.190 --> 00:08:37.610
>> Ok.

00:08:37.610 --> 00:08:40.395
>> Deixe-me mostrá-lo aqui.

00:08:40.395 --> 00:08:42.970
>> Isso é totalmente algo
que o que sempre acontece, certo?

00:08:42.970 --> 00:08:45.220
Porque vá a uma página de detalhes,

00:08:45.220 --> 00:08:46.740
provavelmente carregar algumas informações,

00:08:46.740 --> 00:08:48.080
pode estar puxando alguns
informações de

00:08:48.080 --> 00:08:51.095
um banco de dados na tela,
e isso pode ser ruim.

00:08:51.095 --> 00:08:53.930
>> Imagine-se que você é
usando o aplicativo Instagram.

00:08:53.930 --> 00:08:55.330
Você tem uma página de detalhes lá.

00:08:55.330 --> 00:08:56.710
Você toca e segue,

00:08:56.710 --> 00:08:58.435
entrar em detalhes, voltou.

00:08:58.435 --> 00:09:00.720
Vá verificar outra pasta,
entrar em detalhes,

00:09:00.720 --> 00:09:03.920
voltou, e em uma semana o seu aplicativo
acidentes e ninguém sabe por quê.

00:09:03.920 --> 00:09:06.680
É aí que a memória emite
poderia entrar em jogo.

00:09:06.680 --> 00:09:09.180
>> Tenho você.

00:09:09.180 --> 00:09:11.855
>> Eu não vou te mostrar isso
vazamento de memória ainda está lá

00:09:11.855 --> 00:09:14.650
porque eu quero mostrar
você o profiler,

00:09:14.650 --> 00:09:16.375
como você pode identificar esses problemas.

00:09:16.375 --> 00:09:17.800
Para identificar esses problemas,

00:09:17.800 --> 00:09:19.990
você tem algumas ferramentas.

00:09:19.990 --> 00:09:23.350
Primeiro de tudo, são ferramentas nativas,
IOs fornece instrumentos,

00:09:23.350 --> 00:09:25.520
e o segundo é a ferramenta gerenciada,

00:09:25.520 --> 00:09:27.005
que é Xamarin Profiler.

00:09:27.005 --> 00:09:27.990
>> Tenho você.

00:09:27.990 --> 00:09:29.520
>> Por que acha que precisamos dos dois?

00:09:29.520 --> 00:09:32.985
>> Bem, eles fazem coisas diferentes.

00:09:32.985 --> 00:09:36.090
>> Sim. Realmente
por causa desta imagem.

00:09:36.090 --> 00:09:38.025
Lembrar. Eu estava falando sobre isso.

00:09:38.025 --> 00:09:41.565
Eles realmente podem saber
sobre a sua própria parte.

00:09:41.565 --> 00:09:44.190
Então Xamarin Profiler não sabe nada

00:09:44.190 --> 00:09:47.100
sobre o nativo da memória
objetos criados lá,

00:09:47.100 --> 00:09:50.010
e instrumentos nativos não
saber sobre a memória gerenciada.

00:09:50.010 --> 00:09:52.685
Ele só diz que há alguns
pedaço de objeto criado.

00:09:52.685 --> 00:09:54.710
Quando Mono cria um objeto,

00:09:54.710 --> 00:09:57.275
ele ainda ligá-lo de alguma forma
aos objetos nativos.

00:09:57.275 --> 00:09:59.210
Então, aqueles que você será capaz de ver,

00:09:59.210 --> 00:10:00.500
mas todo o resto não será.

00:10:00.500 --> 00:10:01.220
>> Ok. Fresco.

00:10:01.220 --> 00:10:02.945
>> Então vamos ver o Xamarin Profiler.

00:10:02.945 --> 00:10:06.550
É mais fácil de compreender
no início,

00:10:06.550 --> 00:10:10.955
e também mostra-lhe agradável
nomeespaço e gosto de nomear.

00:10:10.955 --> 00:10:12.815
Assim, você pode identificar seu objeto.

00:10:12.815 --> 00:10:16.715
Há um pequeno botão "Run"
e "Perfil de Partida" aqui.

00:10:16.715 --> 00:10:20.050
Você precisa de uma empresa
licença para fazer isso.

00:10:20.050 --> 00:10:23.870
Mas é muito conveniente e
Encorajo-vos a fazer isso.

00:10:23.870 --> 00:10:25.190
Então, uma vez que você faz isso,

00:10:25.190 --> 00:10:26.825
ele realmente constrói o aplicativo com

00:10:26.825 --> 00:10:31.130
alguns metadados adicionais e
código incorporado em seu aplicativo.

00:10:31.130 --> 00:10:33.580
Assim, pudemos ver e
rastrear os objetos.

00:10:33.580 --> 00:10:36.140
>> Agora uma coisa enquanto isso
está construindo e implantando é,

00:10:36.140 --> 00:10:38.030
estamos correndo em um
simulador que significa que

00:10:38.030 --> 00:10:40.520
tem toda a potência deste.

00:10:40.520 --> 00:10:45.320
Está tudo bem que eu estou fazendo isso
e perfilá-lo no meu dispositivo,

00:10:45.320 --> 00:10:49.150
ou é melhor fazê-lo em um
iPhone físico, por exemplo?

00:10:49.150 --> 00:10:50.570
>> Essa é uma boa pergunta porque você

00:10:50.570 --> 00:10:52.340
pode fazer diferentes tipos de perfil.

00:10:52.340 --> 00:10:52.940
>> Interessante.

00:10:52.940 --> 00:10:54.230
>> Se você está perfilando CPU,

00:10:54.230 --> 00:10:56.480
não é uma boa ideia.
para fazê-lo no simulador

00:10:56.480 --> 00:10:58.820
porque você não tem o
potência total do dispositivo.

00:10:58.820 --> 00:11:01.340
Mas se você está fazendo uma memória
profiler e alocação,

00:11:01.340 --> 00:11:04.355
você vai ter os mesmos problemas
no simulador e no dispositivo.

00:11:04.355 --> 00:11:04.730
>> Perfeito.

00:11:04.730 --> 00:11:10.300
>> Eu gosto de fazê-lo no laptop
porque começa mais rápido.

00:11:10.300 --> 00:11:13.010
Ele não traduz o código

00:11:13.010 --> 00:11:16.085
em instruções nativas e apenas
simula e executado instantaneamente.

00:11:16.085 --> 00:11:18.470
Então, sempre que você faz perfis de memória,

00:11:18.470 --> 00:11:20.180
se você executar aplicativos tantas vezes,

00:11:20.180 --> 00:11:23.045
Então você vai gostar.

00:11:23.045 --> 00:11:25.085
Deixe-me fazer o mesmo teste.

00:11:25.085 --> 00:11:27.980
Então eu abri a página detalhes uma vez,

00:11:27.980 --> 00:11:29.840
e você vê este pequeno pico aqui.

00:11:29.840 --> 00:11:33.590
Significa que aumentamos a nossa
uso da memória significativamente.

00:11:33.590 --> 00:11:35.915
Mas você não vê isso.
aumento da memória aqui.

00:11:35.915 --> 00:11:38.510
Ainda é como se o maior objeto fosse

00:11:38.510 --> 00:11:40.730
sistemas de árvore e em algum lugar aqui.

00:11:40.730 --> 00:11:43.155
Deixe-me fazê-lo mais algumas vezes.

00:11:43.155 --> 00:11:45.815
Vou aumentá-lo novamente.

00:11:45.815 --> 00:11:47.610
Você vai ver o pico aqui,

00:11:47.610 --> 00:11:49.735
mas você não vê nenhum pico aqui.

00:11:49.735 --> 00:11:53.330
O que significa que quando alocamos
em algo na memória nativa,

00:11:53.330 --> 00:11:56.220
não reflete
ele no mundo gerenciado,

00:11:56.220 --> 00:11:59.419
mas vemos que a memória total é
crescimento e não deslocação,

00:11:59.419 --> 00:12:00.720
que é a coisa mais importante.

00:12:00.720 --> 00:12:01.455
>> Eu vejo.

00:12:01.455 --> 00:12:04.015
>> Voltamos com este instantâneo.

00:12:04.015 --> 00:12:05.710
Instantâneo de memória realmente é executado

00:12:05.710 --> 00:12:07.875
a coleta de lixo
no site gerenciado.

00:12:07.875 --> 00:12:10.195
Então, nós fazemos este instantâneo.
Vou fazer outro.

00:12:10.195 --> 00:12:11.755
Vou explicar mais tarde,

00:12:11.755 --> 00:12:14.500
para lidar com a sugestão de finalização.

00:12:14.500 --> 00:12:17.475
Mas, basicamente, agora é memória limpa.

00:12:17.475 --> 00:12:19.605
Vamos ter certeza de que
nosso coletor de lixo

00:12:19.605 --> 00:12:22.270
já correu e desalocado
todo o objeto adquirido.

00:12:22.270 --> 00:12:23.920
Ainda vemos as memórias lá.

00:12:23.920 --> 00:12:25.845
Então ainda aconteceu.

00:12:25.845 --> 00:12:28.755
Para saber o que está acontecendo aqui,

00:12:28.755 --> 00:12:32.005
nós apenas vamos aqui e
use o botão do filtro.

00:12:32.005 --> 00:12:35.265
Estamos tentando identificar.
apenas objetos R,

00:12:35.265 --> 00:12:38.110
e eu também quero ver em
os objetos vivos aqui.

00:12:38.110 --> 00:12:40.980
Então eu bati este "Aplicar"
botão, e voila,

00:12:40.980 --> 00:12:43.575
vemos dois detalhes controlador
pendurado na memória,

00:12:43.575 --> 00:12:47.160
mesmo que eu não
tem detalhes no lugar.

00:12:47.160 --> 00:12:48.570
>> Super amostra, então você disse,

00:12:48.570 --> 00:12:50.289
encontrar tudo no meu nome-espaço,

00:12:50.289 --> 00:12:51.610
filtrar para baixo sobre isso.

00:12:51.610 --> 00:12:54.820
Literalmente o que vemos aqui
é detalhe Ver Controlador 2.

00:12:54.820 --> 00:12:55.225
>> Sim.

00:12:55.225 --> 00:12:56.650
>> Mas deve ter ido embora.

00:12:56.650 --> 00:13:00.015
>> Vou começar com o maior
objetos que você tem nestas páginas.

00:13:00.015 --> 00:13:00.280
>> Sim.

00:13:00.280 --> 00:13:02.865
>> É verdade para o Android também.

00:13:02.865 --> 00:13:04.030
Você só procura por atividades,

00:13:04.030 --> 00:13:05.395
ver modelos, ou o que quer,

00:13:05.395 --> 00:13:07.875
porque uma vez que você tem uma visão
modelo pendurado lá,

00:13:07.875 --> 00:13:11.320
ele começa a ligar todos
os outros objetos.

00:13:11.320 --> 00:13:13.380
Todos os serviços, todas as ligações,

00:13:13.380 --> 00:13:16.605
todas as uis, e você vai
obter um monte de memória.

00:13:16.605 --> 00:13:17.500
>> Entendi.

00:13:17.500 --> 00:13:19.465
>> Deixe-me mostrar que é verdade.

00:13:19.465 --> 00:13:23.260
Vou abri-lo mais um
tempo, bateu o "Instantâneo".

00:13:23.260 --> 00:13:25.455
Vemos três casos aqui.

00:13:25.455 --> 00:13:28.569
Vou voltar, a certa hora do "Instantâneo",

00:13:28.569 --> 00:13:30.030
e fica na memória.

00:13:30.030 --> 00:13:30.660
>> Tenho você.

00:13:30.660 --> 00:13:32.500
>> Então vamos corrigir esse problema de memória.

00:13:32.500 --> 00:13:33.700
>> Estou pronto.

00:13:33.700 --> 00:13:36.470
>> Como você consertaria isso?

00:13:41.220 --> 00:13:43.525
Esta é uma página de detalhes,

00:13:43.525 --> 00:13:45.460
por isso, precisamos cancelar a inscrição
em algum evento.

00:13:45.460 --> 00:13:49.325
>> Tenho você. Então, a verdadeira questão aqui
é que eu assinei um evento.

00:13:49.325 --> 00:13:49.970
>> Sim.

00:13:49.970 --> 00:13:52.135
>> Então devemos cancelar a inscrição, certo?

00:13:52.135 --> 00:13:54.550
>> Isso está correto. Este
é uma boa prática.

00:13:54.550 --> 00:13:56.370
Sempre que você vê isso mais igual,

00:13:56.370 --> 00:13:59.490
você apenas procurar se
há um menos igual,

00:13:59.490 --> 00:14:01.980
se não for, você
deve introduzir isso.

00:14:01.980 --> 00:14:02.595
>> Entendi.

00:14:02.595 --> 00:14:05.020
>> Esta é a primeira indicação
que você tem um vazamento de memória.

00:14:05.020 --> 00:14:05.340
>> Entendi.

00:14:05.340 --> 00:14:10.460
>> A única exceção é quando
você se inscrever na página principal,

00:14:10.460 --> 00:14:12.285
como a nossa página principal aqui,

00:14:12.285 --> 00:14:14.725
e você tem certeza de que esta página

00:14:14.725 --> 00:14:18.010
não será capaz de ir
fora tão cedo.

00:14:18.010 --> 00:14:20.115
>> Talvez você tenha em
seus níveis de delegado de aplicativos.

00:14:20.115 --> 00:14:21.530
Na verdade, eu.
quer que isso seja

00:14:21.530 --> 00:14:23.290
um evento global para todos os tempos.

00:14:23.290 --> 00:14:25.845
Mas também talvez quando o seu aplicativo
entra em segundo plano,

00:14:25.845 --> 00:14:27.295
você também deve cancelar a inscrição.

00:14:27.295 --> 00:14:28.345
>> Isso é verdade.

00:14:28.345 --> 00:14:28.675
>> Sim.

00:14:28.675 --> 00:14:29.700
>> Não para executar.

00:14:29.700 --> 00:14:31.750
>> Então agora você está dizendo
quando parece,

00:14:31.750 --> 00:14:33.855
ele vai subscrever, e desaparecer,

00:14:33.855 --> 00:14:35.935
cancelar a inscrição, e então você
retire o de cima.

00:14:35.935 --> 00:14:37.990
>> Sim, eu me afastei da Nuvem,

00:14:37.990 --> 00:14:39.710
porque queremos
executá-lo cada vez que

00:14:39.710 --> 00:14:42.040
aparecem e toda vez que desaparecemos.

00:14:42.040 --> 00:14:43.850
Além disso, igual para se inscrever,

00:14:43.850 --> 00:14:45.640
menos igual a cancelar a inscrição.

00:14:45.640 --> 00:14:48.735
Nada complicado, só quero

00:14:48.735 --> 00:14:52.045
certifique-se de que não precisamos de nenhum
instrumentos uma vez que você passar por isso.

00:14:52.045 --> 00:14:52.720
>> Legal.

00:14:52.720 --> 00:14:55.110
>> Então eu estou fazendo as mesmas coisas,

00:14:55.110 --> 00:14:59.490
indo para detalhes,
mostrando que é verdade.

00:14:59.490 --> 00:15:02.980
Tirando fotos,
filtro em meus eventos.

00:15:02.980 --> 00:15:05.300
Desculpa. Ele só clicou.

00:15:08.700 --> 00:15:12.170
Vamos ver nos objetos vivos.

00:15:12.420 --> 00:15:15.345
Devemos ver os detalhes
porque estamos atualmente em

00:15:15.345 --> 00:15:17.475
página de detalhes. Vamos voltar.

00:15:17.475 --> 00:15:18.990
Nós batemos um "instantâneo"

00:15:18.990 --> 00:15:20.880
e o que esperamos aqui?

00:15:20.880 --> 00:15:23.715
Primeiro, coleta de lixo na verdade

00:15:23.715 --> 00:15:26.065
colocar esses objetos em
sugestão de finalização,

00:15:26.065 --> 00:15:27.625
mas segundo deve cue 1,

00:15:27.625 --> 00:15:30.340
ou provavelmente ainda o mesmo.

00:15:30.340 --> 00:15:31.570
>> Agora ele se foi.

00:15:31.570 --> 00:15:33.910
>> Sim. Então, deixe-me falar sobre

00:15:33.910 --> 00:15:36.940
sugestão de finalização em um
segundo, mas por enquanto,

00:15:36.940 --> 00:15:40.395
a ideia é que temos
perdeu a nossa visão de detalhes,

00:15:40.395 --> 00:15:43.135
e nosso uso da memória descendo.

00:15:43.135 --> 00:15:43.770
>> Bonito.

00:15:43.770 --> 00:15:46.150
>> É assim que corrigimos vazamentos de memória.

00:15:46.150 --> 00:15:49.420
>> Sim. Você se inscreveu
Eventos. Cancelar a inscrição em eventos.

00:15:49.420 --> 00:15:51.630
>> Regra básica empírica.

00:15:51.630 --> 00:15:54.915
>> Isso também é muito engraçado
porque um, causa dois problemas.

00:15:54.915 --> 00:15:56.800
Vimos que você estava mantendo-o vivo

00:15:56.800 --> 00:15:58.750
porque esses eventos continuam.

00:15:58.750 --> 00:16:00.715
Então, agora você está atirando
eles várias vezes,

00:16:00.715 --> 00:16:04.290
mas também, qualquer coisa nessa página
vai ficar na memória.

00:16:04.290 --> 00:16:06.685
>> É isso mesmo. É por isso que
adicionamos uma imagem pesada,

00:16:06.685 --> 00:16:08.205
e ainda está na memória.

00:16:08.205 --> 00:16:08.830
>> Entendi.

00:16:08.830 --> 00:16:10.570
>> Deixe-me mostrar-lhe instrumentos.

00:16:10.570 --> 00:16:13.390
Então, eu vou apresentar
back nosso vazamento de memória.

00:16:13.390 --> 00:16:13.800
>> Claro.

00:16:13.800 --> 00:16:15.985
>> Apenas removendo o evento de saque.

00:16:15.985 --> 00:16:18.435
Vou me mudar para o meu simulador.

00:16:18.435 --> 00:16:21.330
e os instrumentos funcionam bastante fácil.

00:16:21.330 --> 00:16:23.355
Você acabou de escolher o alvo de

00:16:23.355 --> 00:16:25.930
o simulador e o
app, e é isso.

00:16:25.930 --> 00:16:28.435
Isso é tudo que você precisa para começar
o profiler instrumentos.

00:16:28.435 --> 00:16:30.175
Mesmo que seja O Aplicativo Xamarin,

00:16:30.175 --> 00:16:32.150
você pode iniciá-lo direito
dos Instrumentos,

00:16:32.150 --> 00:16:33.615
que não sabe nada sobre Xamarin.

00:16:33.615 --> 00:16:35.310
>> De onde vêm os instrumentos?

00:16:35.310 --> 00:16:38.709
>> Maçã. É uma Maçã
ferramenta, vem com Xcode,

00:16:38.709 --> 00:16:41.950
e tem um monte de
ferramentas dentro dele.

00:16:41.950 --> 00:16:43.450
>> Então é apenas construído em
porque você já tem

00:16:43.450 --> 00:16:45.415
Xcode instalado? Então
todo mundo tem isso?

00:16:45.415 --> 00:16:46.015
>> É de graça.

00:16:46.015 --> 00:16:48.925
>> É de graça. Fresco. Então, qualquer um
pode usar isso agora hoje?

00:16:48.925 --> 00:16:53.880
>> Sim. Você pode realmente
ver essas atividades,

00:16:53.880 --> 00:16:57.920
mesmo que aqueles criados por
mundo como atividade de detalhes,

00:16:57.920 --> 00:17:00.525
ainda está representado
por um objeto nativo.

00:17:00.525 --> 00:17:00.930
>> Entendi.

00:17:00.930 --> 00:17:02.855
>> Então vamos olhar para esse objeto.

00:17:02.855 --> 00:17:07.240
Chamamos-lhe detalhes ver controlador.

00:17:07.240 --> 00:17:09.595
Deixe-me criar alguns deles.

00:17:09.595 --> 00:17:11.030
>> Isto é realmente
muito legal porque

00:17:11.030 --> 00:17:12.240
Eu nunca usei instrumentos,

00:17:12.240 --> 00:17:15.295
não conte a ninguém, em anos.

00:17:15.295 --> 00:17:18.440
Eu não acho que todo mundo está dando
me um detalhe. Então, existe?

00:17:18.440 --> 00:17:20.070
>> Sim, ele existe.

00:17:20.070 --> 00:17:22.335
>> Isso faz sentido
porque Xamarin é nativo,

00:17:22.335 --> 00:17:23.770
Assim, cria um objeto nativo.

00:17:23.770 --> 00:17:26.380
>> Sim. Você não precisa fazer

00:17:26.380 --> 00:17:27.885
um instantâneo de memória aqui

00:17:27.885 --> 00:17:29.975
porque não temos
coleta de lixo aqui.

00:17:29.975 --> 00:17:33.780
O IOS usa a hierarquia, que é
contador de referência automática.

00:17:33.780 --> 00:17:35.605
Basicamente, sempre que
você cria um objeto,

00:17:35.605 --> 00:17:37.065
ele incrementa o contador,

00:17:37.065 --> 00:17:39.550
sempre que você não usa ou ele

00:17:39.550 --> 00:17:42.505
vai longe do escopo de
uso, ele decrements o contador.

00:17:42.505 --> 00:17:43.845
Uma vez que o contador é zero,

00:17:43.845 --> 00:17:46.495
o objeto é lixo, e
poderia ser coletado.

00:17:46.495 --> 00:17:48.075
Por isso, é bastante fácil de começar

00:17:48.075 --> 00:17:51.735
os instrumentos com o aplicativo
apenas clicando neste botão.

00:17:51.735 --> 00:17:53.505
Ele inicia o aplicativo,

00:17:53.505 --> 00:17:55.860
ele mostra o uso da memória aqui.

00:17:55.860 --> 00:17:57.690
Vamos abrir a página detalhes.

00:17:57.690 --> 00:18:00.425
>> Tenho você. Instrumentos
vem da Apple?

00:18:00.425 --> 00:18:02.040
>> Instrumentos vem da Apple.

00:18:02.040 --> 00:18:03.350
É uma ferramenta gratuita da Apple.

00:18:03.350 --> 00:18:04.490
Você pode usar isso agora.

00:18:04.490 --> 00:18:05.390
>> Legal.

00:18:05.390 --> 00:18:06.970
>> Você vê que também temos

00:18:06.970 --> 00:18:10.140
esta pegada de memória direita
aqui, uma vez que abrimos página detalhes.

00:18:10.140 --> 00:18:12.120
Vamos abri-lo mais uma vez.

00:18:12.120 --> 00:18:15.140
>> Então isso é muito semelhante
para o profiler Xamarin,

00:18:15.140 --> 00:18:16.870
mas isso vai nos mostrar.

00:18:16.870 --> 00:18:19.240
a pilha nativa para todos
intenções e propósitos.

00:18:19.240 --> 00:18:21.500
>> É isso mesmo. Infelizmente, ele

00:18:21.500 --> 00:18:24.090
não sabe nada sobre
Xamarin e mundo gerenciado,

00:18:24.090 --> 00:18:27.025
para que você não será capaz de ver
o objeto gerenciado que criou.

00:18:27.025 --> 00:18:28.990
Então você vê o pico,

00:18:28.990 --> 00:18:30.850
e você vê que não vai embora.

00:18:30.850 --> 00:18:33.350
Então, deixe-me fazê-lo uma terceira vez,

00:18:33.350 --> 00:18:35.145
e apenas mostrar os objetos.

00:18:35.145 --> 00:18:38.455
Então, vamos ver. Há
um pequeno botão de filtro.

00:18:38.455 --> 00:18:43.170
Vamos a todas as alocações aqui,

00:18:43.170 --> 00:18:45.165
e bateu o "Detalhes".

00:18:45.165 --> 00:18:45.820
>> Ok.

00:18:45.820 --> 00:18:47.555
>> São três páginas aqui,

00:18:47.555 --> 00:18:48.660
eles estão todos na memória,

00:18:48.660 --> 00:18:50.650
e eles alocam na memória.

00:18:50.650 --> 00:18:54.070
Não vou mostrar como desalocar
porque é a mesma correção,

00:18:54.070 --> 00:18:57.020
nós apenas cancelar a inscrição,
unsubscribes mundo gerenciado

00:18:57.020 --> 00:19:00.120
do objeto. Objeto
considerado lixo.

00:19:00.120 --> 00:19:04.660
Em seguida, o nosso coletor de lixo
recolhe essas informações,

00:19:04.660 --> 00:19:06.460
então nativo pode coletar
porque nada

00:19:06.460 --> 00:19:08.490
de gerir o mundo
já segurando isso.

00:19:08.490 --> 00:19:10.780
>> Faz sentido. Então, muito
muito a mesma correção,

00:19:10.780 --> 00:19:12.255
mas outra maneira de detectá-lo.

00:19:12.255 --> 00:19:15.045
>> É isso mesmo. Então, isso é

00:19:15.045 --> 00:19:19.345
sobre as diferenças entre
mundo nativo e gerenciado.

00:19:19.345 --> 00:19:22.120
Meus próximos exemplos
ser principalmente sobre gerenciado

00:19:22.120 --> 00:19:25.320
mundo, porque você pode
introduzir a questão em qualquer,

00:19:25.320 --> 00:19:26.905
e não está relacionado com Xamarin.

00:19:26.905 --> 00:19:29.570
Como você disse, poderia ser
assinando evento estático,

00:19:29.570 --> 00:19:32.745
poderia introduzir
questão, mesmo em qualquer lugar.

00:19:32.745 --> 00:19:35.410
Então a próxima coisa é

00:19:35.410 --> 00:19:38.210
sobre a assinatura, e
sem assinaturas.

00:19:38.210 --> 00:19:39.315
Mas neste caso,

00:19:39.315 --> 00:19:42.820
na verdade, estamos
assinando implicitamente,

00:19:42.820 --> 00:19:44.480
não usamos mais iguais.

00:19:44.480 --> 00:19:46.015
Então é mais difícil de encontrar.

00:19:46.015 --> 00:19:48.710
Neste caso, nós corremos isso
centro de notificação tentando

00:19:48.710 --> 00:19:51.795
identificar sempre que nosso aplicativo é girado.

00:19:51.795 --> 00:19:53.695
Acrescentamos este observador.

00:19:53.695 --> 00:19:57.525
Este é um centro padrão singleton.

00:19:57.525 --> 00:19:59.700
Estamos dizendo isso, eu quero ter

00:19:59.700 --> 00:20:02.595
qualquer informação
orientação mudou,

00:20:02.595 --> 00:20:04.140
e aqui está o meu manipulador para isso.

00:20:04.140 --> 00:20:04.650
>> Entendi.

00:20:04.650 --> 00:20:06.690
>> O manipulador em si,
É bastante fácil.

00:20:06.690 --> 00:20:08.125
Não faremos nada lá.

00:20:08.125 --> 00:20:11.665
Vamos imprimi-lo para depurar.

00:20:11.665 --> 00:20:12.465
>> Entendi.

00:20:12.465 --> 00:20:15.525
>> Deixe-me remover o
material de conectividade porque

00:20:15.525 --> 00:20:18.630
queremos introduzir diferentes
tipos de problema de memória.

00:20:18.630 --> 00:20:21.525
Eu também comentar o nosso
imagem porque não precisamos

00:20:21.525 --> 00:20:24.430
para mostrar a memória
pegada, ele está lá.

00:20:24.430 --> 00:20:28.390
Vamos experimentar apenas com
UI ver controladores e pontos de vista.

00:20:28.390 --> 00:20:30.650
>> Muito legal. Então, isso
é muito semelhante,

00:20:30.650 --> 00:20:32.870
mas esse padrão, você
poderia ser a assinatura,

00:20:32.870 --> 00:20:34.605
talvez até mesmo passar em uma ação.

00:20:34.605 --> 00:20:38.340
Ou, neste caso, o que ele faz
Diz que aqui está o seu retorno.

00:20:38.340 --> 00:20:40.010
Os delegados são muito semelhantes,

00:20:40.010 --> 00:20:41.115
Eu acho que para esses padrões.

00:20:41.115 --> 00:20:42.480
Então é só alguma coisa.
Estou acostumado também.

00:20:42.480 --> 00:20:45.590
>> É isso mesmo. Isso foi.

00:20:45.590 --> 00:20:47.864
sua idéia principal, porque
quando você está assinando,

00:20:47.864 --> 00:20:51.405
você está passando a referência a
o Controlador de Visualização de IAs também.

00:20:51.405 --> 00:20:53.425
Este é apenas um diferente
maneira de passar a referência.

00:20:53.425 --> 00:20:55.260
Não é tão óbvio às vezes.

00:20:55.260 --> 00:20:57.955
Então, temos a nossa assinatura,
Está correndo aqui.

00:20:57.955 --> 00:20:59.305
Está funcionando apenas uma vez.

00:20:59.305 --> 00:21:01.780
Vamos fechar e abri-lo novamente.

00:21:01.780 --> 00:21:03.525
Agora, temos um clique duplo.

00:21:03.525 --> 00:21:05.230
Deixe-me limpar para lhe mostrar isso.

00:21:05.230 --> 00:21:07.240
Girando uma vez, ficando dois,

00:21:07.240 --> 00:21:11.655
o que significa que temos alguma visão de iu
Controlador que pendura na memória,

00:21:11.655 --> 00:21:13.535
enquanto ainda processa o primeiro.

00:21:13.535 --> 00:21:13.980
>> Entendi.

00:21:13.980 --> 00:21:15.430
>> Pode ser um problema se você tiver

00:21:15.430 --> 00:21:19.660
alguma lógica de atualização de banco de dados
ou HTTP solicitar horas extras.

00:21:19.660 --> 00:21:21.340
Como em um dia de uso,

00:21:21.340 --> 00:21:24.810
seu aplicativo não é morto, você
desativar, reativar.

00:21:24.810 --> 00:21:26.740
Ele vai ter tudo isso
Ver ainda na memória,

00:21:26.740 --> 00:21:28.265
e em uma semana, pode cair.

00:21:28.265 --> 00:21:28.785
>> Sim.

00:21:28.785 --> 00:21:30.105
>> Então, como corrigir isso?

00:21:30.105 --> 00:21:31.550
É muito fácil.

00:21:31.550 --> 00:21:34.145
>> Presumo que você cancelar a inscrição?

00:21:34.145 --> 00:21:35.835
>> É isso mesmo. É mais difícil

00:21:35.835 --> 00:21:38.685
cancelar a inscrição porque você
não tem mais igual.

00:21:38.685 --> 00:21:42.010
Deixe-me mostrar também o que você
na verdade, mande aqui.

00:21:42.010 --> 00:21:43.365
Então, quando você se inscrever,

00:21:43.365 --> 00:21:46.395
você está passando o nome do método.

00:21:46.395 --> 00:21:48.215
Você está realmente passando por uma ação,

00:21:48.215 --> 00:21:51.745
e compilador está fazendo um
grande trabalho de esconder isso,

00:21:51.745 --> 00:21:54.150
e tornar nossas vidas mais fáceis.

00:21:54.150 --> 00:21:55.945
>> Compilador é muito bom.

00:21:55.945 --> 00:21:57.255
>> Muito bom para nós.

00:21:57.255 --> 00:22:00.415
É por isso que gostamos de ser desenvolvedores.

00:22:00.415 --> 00:22:04.360
Então, ele realmente pede
ação com NSNotification.

00:22:04.360 --> 00:22:07.840
Então, eu estou assinando NSNotification aqui,

00:22:07.840 --> 00:22:13.365
e, em seguida, usando esta notação,
colando este objeto.

00:22:13.365 --> 00:22:16.560
Então, em vez do nome do método,

00:22:16.560 --> 00:22:19.225
na verdade, estamos passando.
uma ação e objeto,

00:22:19.225 --> 00:22:20.960
que detém a referência

00:22:20.960 --> 00:22:23.610
esses metadados sobre como
para chamar o método.

00:22:23.610 --> 00:22:26.555
Então não passamos o método,
É apenas uma referência.

00:22:26.555 --> 00:22:30.060
No nosso caso, o mais importante
parte ao passar esta referência,

00:22:30.060 --> 00:22:32.155
qual é o controlador UIV,

00:22:32.155 --> 00:22:34.170
e é por isso que é mantido na memória.

00:22:34.170 --> 00:22:35.260
>> Entendi.

00:22:35.260 --> 00:22:35.865
>> Ok.

00:22:35.865 --> 00:22:36.670
>> Faz sentido. Sim.

00:22:36.670 --> 00:22:38.595
>> Eu não vou estar mostrando os detalhes

00:22:38.595 --> 00:22:40.390
porque a memória
vazamento ainda está lá

00:22:40.390 --> 00:22:43.975
porque vimos estes
coisa para economizar algum tempo.

00:22:43.975 --> 00:22:45.500
Quero me concentrar em

00:22:45.500 --> 00:22:48.830
o pior cenário que
você deve estar ciente.

00:22:48.830 --> 00:22:54.250
Quando o mundo nativo não coloca
muito bem com o mundo gerenciado.

00:22:54.250 --> 00:22:56.280
>> Tenho você. Quando o
dois mundos colidem.

00:22:56.280 --> 00:23:00.265
>> Isso é correto porque sempre
conseguimos objeto criado,

00:23:00.265 --> 00:23:02.155
e há um objeto nativo criado,

00:23:02.155 --> 00:23:05.690
e ele / ela tentando
desalocar objetos nativos,

00:23:05.690 --> 00:23:07.495
nosso mundo gerenciado pensa,

00:23:07.495 --> 00:23:09.330
Ainda não acabei com este objeto.

00:23:09.330 --> 00:23:11.270
Por favor, espere, não

00:23:11.270 --> 00:23:13.765
coletar o objeto porque
Ainda estou trabalhando com isso.

00:23:13.765 --> 00:23:14.525
>> Tenho você.

00:23:14.525 --> 00:23:15.805
>> Pode ser o oposto,

00:23:15.805 --> 00:23:19.130
quando um mundo nativo
poderia criar um objeto,

00:23:19.130 --> 00:23:20.265
e agora um mundo gerenciado pensa,

00:23:20.265 --> 00:23:22.450
não é feito, ainda
lá, então vamos segurar.

00:23:22.450 --> 00:23:25.015
Mesmo que você não tenha outros
referências a este objeto,

00:23:25.015 --> 00:23:29.015
poderia segurá-lo, poderia
mantê-lo não como um lixo.

00:23:29.015 --> 00:23:29.820
>> Tenho você.

00:23:29.820 --> 00:23:31.460
>> Eu poderia explicá-lo com

00:23:31.460 --> 00:23:34.640
estas pequenas imagens
de objetos imortais.

00:23:34.640 --> 00:23:37.230
Então não crie imortal
Objetos. Isso é ruim.

00:23:37.230 --> 00:23:38.435
>> Parece legal.

00:23:38.435 --> 00:23:39.963
>> Sim.

00:23:39.963 --> 00:23:43.355
Acontece quando você
tem estes dois mundos.

00:23:43.355 --> 00:23:46.925
Nativo, você vê à direita o
controlador e pontos de vista nativos,

00:23:46.925 --> 00:23:49.640
e da esquerda você tem

00:23:49.640 --> 00:23:52.580
mundo gerenciado C Sharp, que é
Veja controladores e visualizações.

00:23:52.580 --> 00:23:55.640
Sempre que você não sabe o que é
acontecendo no mundo nativo,

00:23:55.640 --> 00:23:58.070
você não pode coletar
é deste mundo.

00:23:58.070 --> 00:24:00.905
Vou mostrar um exemplo.
como você pode fazer isso.

00:24:00.905 --> 00:24:03.275
Então, no meu exemplo,

00:24:03.275 --> 00:24:07.235
Quero acrescentar aqui um pequeno
pequeno botão "Save",

00:24:07.235 --> 00:24:11.375
e só quero fechar o
Veja uma vez que o usuário bate nisso.

00:24:11.375 --> 00:24:13.925
Vamos supor que o
Botão "Salvar" também vai fazer

00:24:13.925 --> 00:24:17.330
alguns banco de dados lógica de poupança
ou HTTP chama o que quer,

00:24:17.330 --> 00:24:19.055
ele simplesmente não vai voltar

00:24:19.055 --> 00:24:22.145
e ele realmente executa
alguma ação adicional.

00:24:22.145 --> 00:24:22.775
>> Ok.

00:24:22.775 --> 00:24:24.980
>> Como detalhes destes botões,

00:24:24.980 --> 00:24:26.300
enviamos o manipulador.

00:24:26.300 --> 00:24:31.205
Este manipulador está dizendo que
por favor, feche estes controladores.

00:24:31.205 --> 00:24:33.395
>> Parece perfeitamente legítimo para mim.

00:24:33.395 --> 00:24:35.255
>> Sim. Vamos apresentar
um vazamento de memória.

00:24:35.255 --> 00:24:36.230
>> Ok.

00:24:36.230 --> 00:24:42.515
>> Você é ruim. Infelizmente, será que
e é um padrão comum.

00:24:42.515 --> 00:24:45.005
Nós não temos nenhum
evento estático como aqui.

00:24:45.005 --> 00:24:47.195
Não temos nenhum.
tom único como aqui.

00:24:47.195 --> 00:24:49.025
Estamos apenas mantendo este botão aqui,

00:24:49.025 --> 00:24:51.650
este é apenas um item local.

00:24:51.650 --> 00:24:54.260
James, agora nós.
criou um botão e

00:24:54.260 --> 00:24:56.735
queremos adicioná-lo a
nossa visão de navegação.

00:24:56.735 --> 00:25:00.440
Então, nós dissemos nele através do
o item de navegação também não usa

00:25:00.440 --> 00:25:05.225
quaisquer referências estáticas nada
Assim e só isso.

00:25:05.225 --> 00:25:08.015
Agora temos o sub botão
e vamos começar o profiler.

00:25:08.015 --> 00:25:09.890
>> sim e novamente,
super padrão semelhante.

00:25:09.890 --> 00:25:11.285
Eu crio um botão,

00:25:11.285 --> 00:25:15.800
adicionar um botão, e então eu pop o
Ver controlador parece normal.

00:25:15.800 --> 00:25:18.185
>> Ter um delegado que não usa

00:25:18.185 --> 00:25:20.540
quaisquer referências externas ou estáticas

00:25:20.540 --> 00:25:23.225
e não passa nenhuma referência
do nosso controlador.

00:25:23.225 --> 00:25:23.750
>> Tenho você.

00:25:23.750 --> 00:25:27.090
>> Deve funcionar bem,
Certo? Vamos ver.

00:25:27.280 --> 00:25:32.780
Assim profiler mostrará os objetos

00:25:32.780 --> 00:25:34.760
criado no início e eu sou

00:25:34.760 --> 00:25:37.790
vai começar a acompanhar
eles no início.

00:25:37.790 --> 00:25:39.530
Então eu tenho instantâneos escondidos direito

00:25:39.530 --> 00:25:42.455
agora e filtrando apenas para os meus objetos.

00:25:42.455 --> 00:25:45.380
Mais uma vez é muito comum
padrão para solucionar problemas

00:25:45.380 --> 00:25:48.800
problemas de memória apenas para
ver apenas os meus objetos.

00:25:48.800 --> 00:25:52.235
Então eu vou embora uma vez lá.
Este é o meu botão.

00:25:52.235 --> 00:25:55.565
Você vê, este é um novo controle
muito bem a nossa aplicação.

00:25:55.565 --> 00:25:56.870
Temos isso na memória.

00:25:56.870 --> 00:25:58.745
o que é verdade, esperamos isso.

00:25:58.745 --> 00:26:03.410
Voltando, vamos bater em um
mais tempo e mais uma vez.

00:26:03.410 --> 00:26:04.430
"> Mais uma vez porque eu sei.

00:26:04.430 --> 00:26:05.195
"Uma vez".

00:26:05.195 --> 00:26:06.380
>> Ok, e ainda lá.

00:26:06.380 --> 00:26:08.270
>> Mais uma vez, ele ainda está lá.

00:26:08.270 --> 00:26:11.030
Então vamos abri-lo e muito mais vezes.

00:26:11.030 --> 00:26:14.090
Vamos também fechá-lo.
maneira diferente de voltar,

00:26:14.090 --> 00:26:17.390
vai economizar, na verdade
basicamente fazendo o mesmo.

00:26:17.390 --> 00:26:20.090
Vamos bater o "Memória
instantâneo" mais um

00:26:20.090 --> 00:26:22.610
tempo e oh wow nós
têm cinco casos de

00:26:22.610 --> 00:26:24.920
páginas penduradas lá em
memória e se você tem

00:26:24.920 --> 00:26:28.130
uma imagem enorme lá ele
terá muita memória

00:26:28.130 --> 00:26:28.550
>> Entendi.

00:26:28.550 --> 00:26:32.615
>> Então esse é um padrão muito comum

00:26:32.615 --> 00:26:36.800
porque não é óbvio que
você tem um vazamento de memória aqui.

00:26:36.800 --> 00:26:39.830
A questão aqui é
que UIBarButtonItem

00:26:39.830 --> 00:26:43.910
realmente mantém a
alguns recursos nativos,

00:26:43.910 --> 00:26:45.485
é obrigado a recursos nativos.

00:26:45.485 --> 00:26:49.100
Se não dissermos isso claramente.
Eu não preciso mais desse botão,

00:26:49.100 --> 00:26:51.020
você vai introduzir
este objeto imortal.

00:26:51.020 --> 00:26:53.135
>> Tenho você. Então, como fazer
Eu resolvo isso?

00:26:53.135 --> 00:26:56.240
>> Para resolver isso, vamos usar

00:26:56.240 --> 00:26:59.900
nosso evento ViewDisappear e
fazer algo com o nosso botão.

00:26:59.900 --> 00:27:00.150
>> Ok.

00:27:00.150 --> 00:27:01.220
>> Então temos duas opções,

00:27:01.220 --> 00:27:02.735
ou poderíamos usar

00:27:02.735 --> 00:27:05.299
Evento clicado e
inscrever e cancelar a inscrição,

00:27:05.299 --> 00:27:07.160
mas estaremos de volta para

00:27:07.160 --> 00:27:10.400
nosso primeiro item quando assinamos
sem subscrever.

00:27:10.400 --> 00:27:12.560
Vamos fazer algo mais interessante.

00:27:12.560 --> 00:27:14.030
Vamos descartar o botão.

00:27:14.030 --> 00:27:15.680
>> Eu gosto disso. Eu sou
Feito com ele, certo?

00:27:15.680 --> 00:27:18.320
>> Sim, nós meio que dizendo
mundo gerenciado que,

00:27:18.320 --> 00:27:20.495
"Eu sou feito com o botão
por favor, dispor-lo."

00:27:20.495 --> 00:27:24.365
Não é óbvio porque
muitas visualizações e invólucros

00:27:24.365 --> 00:27:26.540
em Xamarin iOS têm
este método de dispor e

00:27:26.540 --> 00:27:29.015
você realmente não sabe quando
você deveria chamar isso.

00:27:29.015 --> 00:27:30.815
Então é um caso interessante.

00:27:30.815 --> 00:27:32.975
Mas vamos fazer isso e vamos correr.

00:27:32.975 --> 00:27:34.700
Essa é a única ação que eu adicionei

00:27:34.700 --> 00:27:37.500
desde a execução da candidatura anterior.

00:27:38.290 --> 00:27:42.530
Estou começando o profiler
e fazendo o mesmo caso de uso.

00:27:42.530 --> 00:27:44.000
Vamos rastrear os objetos de

00:27:44.000 --> 00:27:46.310
o início e fazer
com certeza eles estão dispostos.

00:27:46.310 --> 00:27:48.050
>> Muito legal. Isto é bom.

00:27:48.050 --> 00:27:49.670
Então você poderia ter, como você disse,

00:27:49.670 --> 00:27:53.270
em vez de passar
toda a ação,

00:27:53.270 --> 00:27:55.130
você pode apenas semelhante à forma como nós

00:27:55.130 --> 00:27:57.605
fazer conectividade,
inscrever, cancelar a inscrição,

00:27:57.605 --> 00:28:00.590
Eu teria descoberto isso.
fora, mas neste caso,

00:28:00.590 --> 00:28:03.125
você já fez isso assim
você acabou de se livrar dele.

00:28:03.125 --> 00:28:04.010
>> É isso mesmo.

00:28:04.010 --> 00:28:04.875
>> Legal.

00:28:04.875 --> 00:28:08.455
>> Sim, porque não
esperar que ele seja desinscrito.

00:28:08.455 --> 00:28:10.840
Não é uma assinatura.

00:28:10.840 --> 00:28:14.230
acabamos de passar e delegado
dentro do objeto local.

00:28:14.230 --> 00:28:16.045
Em caso de NotificationCenter,

00:28:16.045 --> 00:28:18.790
é uma espécie de assinatura porque
passamos no objeto local

00:28:18.790 --> 00:28:21.760
em alguma estática
exemplo ou singleton.

00:28:21.760 --> 00:28:24.760
Neste caso, acabamos de utilizar
em nossos recursos locais,

00:28:24.760 --> 00:28:26.395
não esperamos um vazamento de memória.

00:28:26.395 --> 00:28:26.680
>> Tenho você.

00:28:26.680 --> 00:28:28.630
>> Mas infelizmente eu posso ver

00:28:28.630 --> 00:28:32.660
esta barreira muito e as pessoas
entrando nessas situações.

00:28:32.680 --> 00:28:37.530
Então, vamos fazer o mesmo truque.

00:28:37.750 --> 00:28:41.760
Eu gostaria que pudesse salvar esses dados.

00:28:41.950 --> 00:28:46.310
Portanto, temos apenas uma visão
Controlador e delegado.

00:28:46.310 --> 00:28:48.290
Vamos bater "Save".

00:28:48.290 --> 00:28:51.215
Vamos voltar.

00:28:51.215 --> 00:28:54.005
Vamos ficar na página de detalhes.

00:28:54.005 --> 00:28:56.975
Bata "Instantâneo da memória" e nós vemos um.

00:28:56.975 --> 00:28:59.315
Deixe-me clicar mais algumas vezes.

00:28:59.315 --> 00:29:02.735
Vamos falar sobre isso. Então, nós
tem apenas um exemplo aqui.

00:29:02.735 --> 00:29:10.805
Eu clico em "Salvar", clique em "Instantâneo"
e desaparece a varredura.

00:29:10.805 --> 00:29:12.380
OKEY? Vazamento de memória fixo.

00:29:12.380 --> 00:29:13.250
>> Muito legal. Bom.

00:29:13.250 --> 00:29:14.900
>> Objeto imortal foi morto.

00:29:14.900 --> 00:29:16.445
>> Morto. Muito legal.

00:29:16.445 --> 00:29:17.810
Caso contrário, isso é incrível.

00:29:17.810 --> 00:29:20.600
Tão simples, olhe para os seus eventos,

00:29:20.600 --> 00:29:22.850
mas também olhar para como você está passando

00:29:22.850 --> 00:29:24.890
essas ações ao redor e até mesmo eu

00:29:24.890 --> 00:29:26.870
Nem sequer pensar nisso
botão para ser honesto com você

00:29:26.870 --> 00:29:29.315
porque o construtor
está passando por isso.

00:29:29.315 --> 00:29:29.600
>> Sim.

00:29:29.600 --> 00:29:30.725
>> Então, muito legal.

00:29:30.725 --> 00:29:33.350
>> Eu também recomendaria

00:29:33.350 --> 00:29:36.425
nossos desenvolvedores para usá-lo mais
muitas vezes, para gostar de uma vez por semana,

00:29:36.425 --> 00:29:39.545
cada sprint e, em seguida, para
ver o uso da memória,

00:29:39.545 --> 00:29:41.585
você pode vê-lo como um teste de iDa.

00:29:41.585 --> 00:29:45.590
Mostra este pouco
conjunto de trabalho de memória.

00:29:45.590 --> 00:29:48.050
Então você só vê mais
meses se é cresce ou

00:29:48.050 --> 00:29:51.530
não e se ele cresce você
provavelmente tem um vazamento de memória.

00:29:51.530 --> 00:29:53.360
>> Você mostrou iOS.

00:29:53.360 --> 00:29:54.560
Agora, o que acontece para android?

00:29:54.560 --> 00:29:57.500
Existe algum outro específico
ferramentas lá que você pode usar?

00:29:57.500 --> 00:29:59.465
>> É uma ótima pergunta
porque, Android,

00:29:59.465 --> 00:30:02.000
tudo o que falamos
O iOS aplica-se para Android.

00:30:02.000 --> 00:30:02.150
>> Tenho você.

00:30:02.150 --> 00:30:03.440
>> Basta ter ferramenta diferente para

00:30:03.440 --> 00:30:07.145
Perfilador nativo do Android
chamado Android Profiler.

00:30:07.145 --> 00:30:08.390
É muito legal.

00:30:08.390 --> 00:30:09.740
Isso mostra muito

00:30:09.740 --> 00:30:12.380
informações, mas você ainda tem
ter que usá-lo quem é

00:30:12.380 --> 00:30:14.330
o profiler xamarin em conjunto

00:30:14.330 --> 00:30:16.790
por causa do gerenciado
mundo e mundo nativo.

00:30:16.790 --> 00:30:17.930
>> Tenho você. É simplesmente ele

00:30:17.930 --> 00:30:19.340
sons que era legal que
há grandes ferramentas

00:30:19.340 --> 00:30:22.400
disponível, não importa onde
você está em, iOS, Android.

00:30:22.400 --> 00:30:23.240
>> Isso é correto.

00:30:23.240 --> 00:30:24.005
>> Eu posso ir em frente e fazer isso.

00:30:24.005 --> 00:30:25.820
Honestamente, só de olhar
em alguns destes,

00:30:25.820 --> 00:30:28.160
Tenho certeza que meu código,
há muita coisa ruim.

00:30:28.160 --> 00:30:29.480
Então, quando eu transmitir em seguida,

00:30:29.480 --> 00:30:31.790
Vai ser tudo.
consertar meus vazamentos de memória.

00:30:31.790 --> 00:30:32.180
>> Ok.

00:30:32.180 --> 00:30:34.280
>> Muito legal. Qualquer outra coisa Alexi
que você quer falar?

00:30:34.280 --> 00:30:35.315
>> Isso tudo por hoje.

00:30:35.315 --> 00:30:37.865
>> Impressionante. Obrigado.
todos para sintonizar.

00:30:37.865 --> 00:30:40.010
Alexi, muito obrigado por
aparecendo todas essas coisas.

00:30:40.010 --> 00:30:42.305
>> Obrigado a vocês. Agradecer
você James por me deixar.

00:30:42.305 --> 00:30:43.970
>> Absolutamente, e certifique-se

00:30:43.970 --> 00:30:45.920
que você confira todos
as notas do show abaixo,

00:30:45.920 --> 00:30:47.420
abrir toda a fonte
código, todos os links

00:30:47.420 --> 00:30:48.980
para toda a documentação lá embaixo.

00:30:48.980 --> 00:30:51.740
Você também pode ir para aka.ms/Xamarin

00:30:51.740 --> 00:30:54.485
melhores práticas para toda a série.

00:30:54.485 --> 00:30:55.790
Portanto, certifique-se de se inscrever

00:30:55.790 --> 00:30:57.695
hoje, onde quer que esteja.
assistindo agora.

00:30:57.695 --> 00:30:59.090
Sou James Montemagno.

00:30:59.090 --> 00:31:01.790
Este tem sido o Xamarin
Mostrar e obrigado por assistir.

00:31:01.790 --> 00:31:02.480
>> Obrigado a vocês.

00:31:02.480 --> 00:31:09.230
[MÚSICA]

00:31:09.230 --> 00:31:11.120
>> Ei, James aqui.
Só queria fazer o check-in.

00:31:11.120 --> 00:31:13.175
e obrigado por
assistindo a este vídeo.

00:31:13.175 --> 00:31:16.265
Agora faça todas as coisas que você
sabe que você quer fazer como,

00:31:16.265 --> 00:31:18.710
se inscrever, e ding
que sino de notificação,

00:31:18.710 --> 00:31:20.825
tornar-se parte do
esquadrão de notificação.

00:31:20.825 --> 00:31:22.190
Enquanto estiver aqui, confira

00:31:22.190 --> 00:31:25.400
todos esses vídeos incríveis
que eu já codifiquei.

00:31:25.400 --> 00:31:29.040
Clique nessa coisa. Clique
ele, vê-lo, fazê-lo.

