WEBVTT

00:00:00.000 --> 00:00:01.680
>> Sintonizzare in questa settimana
Xamarin Show dove

00:00:01.680 --> 00:00:03.360
il mio buon amico Alexi a parlare

00:00:03.360 --> 00:00:06.810
sulla gestione della memoria per
le vostre applicazioni. Quindi sintonizzati.

00:00:06.810 --> 00:00:13.200
[MUSICA]

00:00:13.200 --> 00:00:14.280
>> Bentornati, tutti,

00:00:14.280 --> 00:00:15.405
al Xamarin Show.

00:00:15.405 --> 00:00:16.650
Sono il vostro ospite James Montemagno.

00:00:16.650 --> 00:00:17.820
Oggi, il mio migliore amico in

00:00:17.820 --> 00:00:21.270
il mondo intero Alexi con
Me. Come va, amico?

00:00:21.270 --> 00:00:22.905
>> Sto bene. E tu?

00:00:22.905 --> 00:00:24.960
>> Sto facendo fantastico.
È una bella giornata

00:00:24.960 --> 00:00:26.640
qui a Redmond, Washington tutti i giorni.

00:00:26.640 --> 00:00:27.325
>> Lo è.

00:00:27.325 --> 00:00:29.085
>> Ora, sei dal nostro cellulare

00:00:29.085 --> 00:00:31.065
consulenza clienti
squadra, è corretto?

00:00:31.065 --> 00:00:31.920
>> Questo è corretto.

00:00:31.920 --> 00:00:33.450
>> Quindi cosa significa?

00:00:33.450 --> 00:00:35.370
>> Significa che lavoriamo con

00:00:35.370 --> 00:00:38.250
i nostri clienti e noi
consigliarli ovviamente.

00:00:38.250 --> 00:00:41.645
Ma soprattutto, lavoriamo con gli sviluppatori
e vedere come usano gli strumenti,

00:00:41.645 --> 00:00:44.300
come funzionano con il nostro strumento Xamarin,

00:00:44.300 --> 00:00:47.560
e quali sono i comuni
insidie che affrontano con.

00:00:47.560 --> 00:00:48.420
>> Perfetto.

00:00:48.420 --> 00:00:50.205
>> Oggi, voglio parlare di

00:00:50.205 --> 00:00:52.355
uno di loro è la gestione della memoria.

00:00:52.355 --> 00:00:53.780
>> Ti ho preso. Sì. È molto importante

00:00:53.780 --> 00:00:55.730
perché spesso parliamo
su tutto il fresco,

00:00:55.730 --> 00:00:57.155
caratteristiche di fantasia che si possono fare,

00:00:57.155 --> 00:01:00.440
ma volevamo avere questo
serie di best practice

00:01:00.440 --> 00:01:02.340
perché si corre in guai.

00:01:02.340 --> 00:01:03.820
Succede. È così facile da fare.

00:01:03.820 --> 00:01:06.345
Gestione della memoria,
onestamente, io sono un noob.

00:01:06.345 --> 00:01:07.770
Davvero non lo so. Io sono come,

00:01:07.770 --> 00:01:09.560
"Stanno andando a uccidere
l'app in cinque secondi.

00:01:09.560 --> 00:01:11.705
Non importa, giusto? Ma
Non dovrei pensare in questo modo.

00:01:11.705 --> 00:01:14.210
>> Questo è vero. Questo è quello che vediamo

00:01:14.210 --> 00:01:16.850
perché a nessuno importa
gestione della memoria.

00:01:16.850 --> 00:01:21.300
Abbiamo così tanta memoria
e non li controlli mai.

00:01:21.300 --> 00:01:24.750
Voglio dire, quando è stata l'ultima volta che
controllare l'utilizzo della memoria dell'app?

00:01:24.750 --> 00:01:26.250
>> L'ultima volta che ho avuto un incidente.

00:01:26.250 --> 00:01:29.510
In realtà, ho avuto un molto
buon esempio di questo.

00:01:29.510 --> 00:01:31.910
Te lo dirò. Questo
è un esempio reale.

00:01:31.910 --> 00:01:35.120
Ho un bug in Xamarin Essentials

00:01:35.120 --> 00:01:38.375
che dice quando chiamo
questo metodo 20.000 volte,

00:01:38.375 --> 00:01:41.570
la mia app si blocca e
era perché non ero

00:01:41.570 --> 00:01:45.155
correttamente lo smaltimento di un
oggetto Android nativo,

00:01:45.155 --> 00:01:46.775
una finestra, un display.

00:01:46.775 --> 00:01:48.170
Quindi quello che sta succedendo è,

00:01:48.170 --> 00:01:50.480
Vorrei continuare a crearlo
e non sarebbe mai ottenere

00:01:50.480 --> 00:01:53.135
spazzatura raccolti mai perché
Non l'ho mai smaltito.

00:01:53.135 --> 00:01:54.890
>> Questo è quello che stiamo andando
di cui parlare oggi.

00:01:54.890 --> 00:01:56.925
>> Sì. fantastico. Facciamolo
esso. Cos'hai per noi?

00:01:56.925 --> 00:02:00.435
>> Quindi abbiamo questo piccolo
semplice app con due finestre,

00:02:00.435 --> 00:02:02.745
schermata principale e la schermata dei dettagli.

00:02:02.745 --> 00:02:06.375
Questo è un modello molto comune
Controller di spostamento dell'interfaccia utente.

00:02:06.375 --> 00:02:09.600
Questa è una semplice Xamarin
applicazione iOS, giusto?

00:02:09.600 --> 00:02:10.305
>> Ok.

00:02:10.305 --> 00:02:12.440
>> Cosa stiamo andando
da fare è introdurre

00:02:12.440 --> 00:02:14.930
perdite di memoria in molti,
in molti modi diversi.

00:02:14.930 --> 00:02:19.025
Ma prima, voglio parlare di
le differenze dal mondo nativo

00:02:19.025 --> 00:02:23.960
e il mondo gestito
prestazioni e memoria.

00:02:23.960 --> 00:02:25.340
Quindi, ogni volta che avete un processo,

00:02:25.340 --> 00:02:27.995
sistema operativo dando
un blocco di memoria.

00:02:27.995 --> 00:02:31.370
Si dovrebbe essere consapevoli di questo
perché una volta esaurita la memoria,

00:02:31.370 --> 00:02:33.670
l'app si blocca o
sistema operativo lo uccide.

00:02:33.670 --> 00:02:35.355
Nella memoria gestita,

00:02:35.355 --> 00:02:40.260
il nostro Xamarin Mono ottenere questi
piccolo pezzo di questa memoria.

00:02:40.260 --> 00:02:41.630
Questo è quando dovremmo essere

00:02:41.630 --> 00:02:43.670
cauto su come abbiamo
utilizzare anche quel pezzo.

00:02:43.670 --> 00:02:44.030
>> Ok.

00:02:44.030 --> 00:02:46.640
>> Quindi si dovrebbe ancora essere
consapevole della memoria nativa,

00:02:46.640 --> 00:02:48.905
e ora una volta che si lavora con Xamarin,

00:02:48.905 --> 00:02:50.320
informazioni sulla parte di gestione.

00:02:50.320 --> 00:02:52.740
>> L'ho ottenuto. Così avete
memoria nativa, iOS,

00:02:52.740 --> 00:02:55.980
Android bit e pezzi,
Memoria gestita .NET?

00:02:55.980 --> 00:02:56.640
>> Esatto.

00:02:56.640 --> 00:02:57.090
>> Perfetto.

00:02:57.090 --> 00:03:00.530
>> Ogni volta che si crea un oggetto
e si crea, diciamo,

00:03:00.530 --> 00:03:02.330
un pulsante dell'interfaccia utente, effettivamente creare

00:03:02.330 --> 00:03:04.950
un pulsante nativo dell'interfaccia utente e
classe di pulsanti dell'interfaccia utente gestita.

00:03:04.950 --> 00:03:06.680
Hanno un impatto diverso sulla memoria.

00:03:06.680 --> 00:03:10.310
Potrebbero causare
problemi di memoria perché c'è

00:03:10.310 --> 00:03:14.135
anche un modo nativo per raccogliere
spazzatura e modo gestito.

00:03:14.135 --> 00:03:20.385
In Mono, usiamo Mono singolo
garbage collector di generazione.

00:03:20.385 --> 00:03:23.460
Nel mondo nativo, iOS usano ARC,

00:03:23.460 --> 00:03:26.680
Android utilizzare il proprio
garbage collector,

00:03:26.680 --> 00:03:29.420
ma dovrebbero lavorare insieme
fianco a fianco e dovremmo

00:03:29.420 --> 00:03:32.300
li hanno perché è possibile
introdurre problemi utilizzando tale.

00:03:32.300 --> 00:03:32.690
>> L'ho ottenuto.

00:03:32.690 --> 00:03:34.640
>> Così il primo e

00:03:34.640 --> 00:03:36.950
l'approccio più semplice per introdurre

00:03:36.950 --> 00:03:40.830
un problema di memoria è una sottoscrizione
senza annullamento dell'iscrizione.

00:03:42.040 --> 00:03:45.680
Il raccoglitore di rifiuti deve sapere
quando c'è una spazzatura.

00:03:45.680 --> 00:03:47.180
Ma come poteva saperlo?

00:03:47.180 --> 00:03:49.565
Dovrebbe essere in grado di costruire

00:03:49.565 --> 00:03:53.915
un grafico ad albero di raggiungibilità
e inizia dai percorsi.

00:03:53.915 --> 00:03:57.320
I nostri eventi statici, variabili statiche,

00:03:57.320 --> 00:03:59.350
eventi statici o chiamate di roll del thread,

00:03:59.350 --> 00:04:01.910
sono tutti percorsi raggiungibili e

00:04:01.910 --> 00:04:05.005
garbage collector tratta
loro come non spazzatura.

00:04:05.005 --> 00:04:06.810
Quindi ogni volta che ti iscrivi in questo modo,

00:04:06.810 --> 00:04:09.560
prendiamo il plugin di connettività.

00:04:09.560 --> 00:04:11.960
Lo so, James, sei
familiarità con questo plugin.

00:04:11.960 --> 00:04:13.400
>> Io sono. Sì. Moltissimo.

00:04:13.400 --> 00:04:14.960
Mi piace. Pollici
qui, siamo solo cosa?

00:04:14.960 --> 00:04:16.220
Sottoscrivendo un evento,

00:04:16.220 --> 00:04:18.610
e potrebbe essere qualsiasi
eventi come l'evento click,

00:04:18.610 --> 00:04:20.360
si dispone di un evento di modifica del sensore.

00:04:20.360 --> 00:04:22.715
Fondamentalmente, qualsiasi cosa mai in .NET.

00:04:22.715 --> 00:04:25.970
>> Sì. È specifico
non solo a Xamarin.

00:04:25.970 --> 00:04:27.830
È un evento statico

00:04:27.830 --> 00:04:31.745
in .NET e connettività
qui c'è solo un esempio.

00:04:31.745 --> 00:04:35.390
Quello che sto cercando di dire,
potrebbe essere qualsiasi evento statico o

00:04:35.390 --> 00:04:38.960
qualsiasi evento singleton fornito.

00:04:38.960 --> 00:04:40.880
Quindi ogni volta che ci iscriviamo in questo modo,

00:04:40.880 --> 00:04:42.520
e diciamo che abbiamo

00:04:42.520 --> 00:04:47.100
questo piccolo pezzo di
Gestore ConnectivityChanged.

00:04:47.100 --> 00:04:49.655
Introduciamo una piccola perdita di memoria.

00:04:49.655 --> 00:04:54.290
È piccolo perché la nostra visione è
piuttosto semplice e leggero,

00:04:54.290 --> 00:04:55.400
ma è una perdita di memoria.

00:04:55.400 --> 00:04:57.685
>> Quindi è una perdita di memoria, perché però?

00:04:57.685 --> 00:05:00.860
>> Perché questa connettività e

00:05:00.860 --> 00:05:03.830
ConnectivityChanged (evento)
è un riferimento statico

00:05:03.830 --> 00:05:05.270
per il nostro garbage collector.

00:05:05.270 --> 00:05:06.980
Una volta che la nostra spazzatura
collezionista sta cercando di

00:05:06.980 --> 00:05:08.810
identificare se si tratta di un immondizia o no,

00:05:08.810 --> 00:05:11.015
non è perché

00:05:11.015 --> 00:05:14.540
L'evento ConnectivityChanged ha
un riferimento a questo gestore,

00:05:14.540 --> 00:05:17.375
e questo gestore in realtà gestisce

00:05:17.375 --> 00:05:21.080
il riferimento al nostro
DetailsViewController.

00:05:21.080 --> 00:05:24.680
>> Vedo. Capito. Quindi abbiamo
ha creato questo evento all'interno di

00:05:24.680 --> 00:05:29.600
questo ViewController e ho
sottoscritto ma mai annullato.

00:05:29.600 --> 00:05:31.970
Quindi ha sempre questo
riferimento immediato.

00:05:31.970 --> 00:05:34.940
Così i garbage collector dicono:
"Ehi, cosa è disponibile?"

00:05:34.940 --> 00:05:37.030
"Non puoi averlo."

00:05:37.030 --> 00:05:38.205
>> Questo è corretto.

00:05:38.205 --> 00:05:40.580
>> Voglio fare in modo che
che è corretto perché io

00:05:40.580 --> 00:05:42.185
credo che sia così
funziona nella mia mente.

00:05:42.185 --> 00:05:43.150
Voglio assicurarmi di avere ragione.

00:05:43.150 --> 00:05:47.225
>> Il garbage collector single task
fa è quello di deallocare la memoria,

00:05:47.225 --> 00:05:48.605
e per farlo correttamente,

00:05:48.605 --> 00:05:50.540
garbage collector dovrebbe sapere come

00:05:50.540 --> 00:05:52.730
identificare correttamente se
è spazzatura o no.

00:05:52.730 --> 00:05:53.180
>> L'ho ottenuto.

00:05:53.180 --> 00:05:55.790
>> Quindi, per costruire un albero di raggiungibilità,

00:05:55.790 --> 00:05:59.270
un garbage collector
utilizza route statiche o

00:05:59.270 --> 00:06:01.430
solo percorsi ed eventi statici

00:06:01.430 --> 00:06:03.500
o qualsiasi proprietà statica
come uno del percorso.

00:06:03.500 --> 00:06:06.460
Anche le variabili locali,
un sacco di altre cose.

00:06:06.460 --> 00:06:07.020
>> L'ho ottenuto.

00:06:07.020 --> 00:06:11.820
>> Quindi fammi solo correre
e mostrare come funziona.

00:06:11.820 --> 00:06:14.745
Pensi che lo faremo
vedere alcuna differenza?

00:06:14.745 --> 00:06:17.540
>> Non lo so. Voglio dire
si spera non perché

00:06:17.540 --> 00:06:20.090
è così semplice è quello che sto pensando.

00:06:20.090 --> 00:06:22.160
Ora, la mia paura però è che

00:06:22.160 --> 00:06:24.200
dal momento che ci stiamo registrando oltre
e più e più volte,

00:06:24.200 --> 00:06:26.750
se cambiamo gli eventi,

00:06:26.750 --> 00:06:28.850
stiamo probabilmente ottenendo
in un sacco di eventi.

00:06:28.850 --> 00:06:30.635
>> sì. Verifichiamolo.

00:06:30.635 --> 00:06:33.560
Così ho spostato alla pagina Dettagli.

00:06:33.560 --> 00:06:36.185
Scollegare il mio Wi-Fi adesso.

00:06:36.185 --> 00:06:38.510
>> Qui, stiamo usando
il simulatore iOS.

00:06:38.510 --> 00:06:41.975
Quindi in realtà sta usando
Internet della macchina.

00:06:41.975 --> 00:06:46.460
>> Sì. Abbiamo appena ricevuto un evento qui
che sono ConnectivityChanged.

00:06:46.460 --> 00:06:51.910
Torniamo un paio di volte
e ancora un paio di volte,

00:06:51.910 --> 00:06:54.630
e sono di nuovo sulla pagina principale.

00:06:54.630 --> 00:06:58.215
Non sono delicato in
qualsiasi cosa in questo momento,

00:06:58.215 --> 00:07:01.280
e presumo che i miei dati
pagina non ci sono più, giusto?

00:07:01.280 --> 00:07:01.430
>> sì.

00:07:01.430 --> 00:07:02.810
>> Il mio gestore di abbonamento

00:07:02.810 --> 00:07:04.805
non dovrebbe funzionare perché
Non ho fatto niente.

00:07:04.805 --> 00:07:07.015
Accendiamo il Wi-Fi.

00:07:07.015 --> 00:07:09.510
>> Ok. Quindi abbiamo effettivamente creato

00:07:09.510 --> 00:07:11.910
this ConnectivityChanged
nella seconda pagina.

00:07:11.910 --> 00:07:12.420
>> Seconda pagina.

00:07:12.420 --> 00:07:13.665
>> Beh, sono sulla prima pagina.

00:07:13.665 --> 00:07:17.440
>> Sì. Quindi non ci aspettiamo
il nostro gestore di lavorare,

00:07:17.440 --> 00:07:18.645
ma guarda cosa abbiamo ottenuto.

00:07:18.645 --> 00:07:21.090
Abbiamo appena ricevuto quattro gestori
l'esecuzione del nostro codice,

00:07:21.090 --> 00:07:23.600
e potrebbe essere qualsiasi
database di aggiornamento del codice,

00:07:23.600 --> 00:07:25.505
salvare le impostazioni, qualunque cosa.

00:07:25.505 --> 00:07:28.070
La questione qui non solo
con gestione della memoria

00:07:28.070 --> 00:07:30.635
perché ci vuole un po' di memoria.

00:07:30.635 --> 00:07:34.970
È anche un problema perché abbiamo
anche del codice da eseguire.

00:07:34.970 --> 00:07:37.445
>> Allora significa
che la pagina Dettagli,

00:07:37.445 --> 00:07:39.350
ora non può mai essere
spazzatura raccolta?

00:07:39.350 --> 00:07:42.455
Così ora ho solo questo
Pagina dei dettagli sempre in memoria.

00:07:42.455 --> 00:07:43.400
>> Purtroppo, sì.

00:07:43.400 --> 00:07:44.660
>> Oh mio Dio, questo è male.

00:07:44.660 --> 00:07:47.385
>> Questo è male. In qualità di sviluppatore,

00:07:47.385 --> 00:07:49.560
non sempre lo vediamo.

00:07:49.560 --> 00:07:54.280
Come utente, vedo la mia app si blocca
come una volta alla settimana, come vuoi.

00:07:54.280 --> 00:07:56.675
Mi limiterò a riavviarlo
e continuare ad usarlo.

00:07:56.675 --> 00:07:58.220
Ecco perché non è segnalato,

00:07:58.220 --> 00:08:00.350
non è preso molto sul serio,

00:08:00.350 --> 00:08:03.950
ma è un problema soprattutto se si

00:08:03.950 --> 00:08:08.330
ottenere un'immagine enorme ci
che influisce sulla memoria.

00:08:08.330 --> 00:08:10.910
Quindi ho intenzione di rimuovere il commento
questa riga di codice,

00:08:10.910 --> 00:08:14.680
che in realtà aggiunge un po 'di carico di memoria

00:08:14.680 --> 00:08:19.740
qui e sta caricando un
immagini da Internet.

00:08:19.740 --> 00:08:22.265
Stiamo solo prendendo un'immagine casuale.

00:08:22.265 --> 00:08:24.815
Lasciate che vi dimostri che è davvero casuale.

00:08:24.815 --> 00:08:27.035
Vediamo cosa otteniamo qui.

00:08:27.035 --> 00:08:29.510
Sono sempre preoccupato.

00:08:29.510 --> 00:08:32.210
ok. Quindi abbiamo questa immagine casuale,

00:08:32.210 --> 00:08:34.370
e questo è quello che siamo
intenzione di caricare in

00:08:34.370 --> 00:08:37.190
la nostra applicazione ogni volta che
andare nella pagina Dettagli.

00:08:37.190 --> 00:08:37.610
>> Ok.

00:08:37.610 --> 00:08:40.395
>> Lasciatemi mostrare qui.

00:08:40.395 --> 00:08:42.970
>> Questo è totalmente qualcosa
che quello che succede sempre, giusto?

00:08:42.970 --> 00:08:45.220
Perché vai a una pagina Dettagli,

00:08:45.220 --> 00:08:46.740
probabilmente caricare alcune informazioni,

00:08:46.740 --> 00:08:48.080
potrebbe essere tirando un po'
informazioni da

00:08:48.080 --> 00:08:51.095
un database su quello schermo,
e questo potrebbe essere un male.

00:08:51.095 --> 00:08:53.930
>> Immagina di essere
utilizzando l'app Instagram.

00:08:53.930 --> 00:08:55.330
Hai una pagina Dettagli lì.

00:08:55.330 --> 00:08:56.710
Tocca e segui,

00:08:56.710 --> 00:08:58.435
entrare nei dettagli, tornato indietro.

00:08:58.435 --> 00:09:00.720
Vai a controllare un'altra cartella,
entrare nei dettagli,

00:09:00.720 --> 00:09:03.920
tornato, e in una settimana la tua applicazione
si blocca e nessuno sa perché.

00:09:03.920 --> 00:09:06.680
Questo è quando i problemi di memoria
potrebbe entrare in gioco.

00:09:06.680 --> 00:09:09.180
>> Ti ho preso.

00:09:09.180 --> 00:09:11.855
>> Non vi mostrerò che
perdita di memoria è ancora lì

00:09:11.855 --> 00:09:14.650
perché voglio mostrare
il profiler,

00:09:14.650 --> 00:09:16.375
come è possibile identificare questi problemi.

00:09:16.375 --> 00:09:17.800
Per identificare questi problemi,

00:09:17.800 --> 00:09:19.990
si dispone di alcuni strumenti.

00:09:19.990 --> 00:09:23.350
Prima di tutto, sono strumenti nativi,
iOs fornisce strumenti,

00:09:23.350 --> 00:09:25.520
e il secondo è lo strumento gestito,

00:09:25.520 --> 00:09:27.005
che è Xamarin Profiler.

00:09:27.005 --> 00:09:27.990
>> Ti ho preso.

00:09:27.990 --> 00:09:29.520
>> Perché pensi che abbiamo bisogno di entrambi?

00:09:29.520 --> 00:09:32.985
>> Beh, fanno cose diverse.

00:09:32.985 --> 00:09:36.090
>> sì. Effettivamente
a causa di questa immagine.

00:09:36.090 --> 00:09:38.025
Ricordare. Stavo parlando di questo.

00:09:38.025 --> 00:09:41.565
In realtà possono sapere
sulla propria parte.

00:09:41.565 --> 00:09:44.190
Così Xamarin Profiler non sa nulla

00:09:44.190 --> 00:09:47.100
circa la memoria nativa
oggetti creati lì,

00:09:47.100 --> 00:09:50.010
e gli strumenti nativi non
conoscere la memoria gestita.

00:09:50.010 --> 00:09:52.685
Si limita a dire che c'è un po'
pezzo di oggetto creato.

00:09:52.685 --> 00:09:54.710
Quando Mono crea un oggetto,

00:09:54.710 --> 00:09:57.275
ancora legarlo in qualche modo
agli oggetti nativi.

00:09:57.275 --> 00:09:59.210
Così quelli che sarete in grado di vedere,

00:09:59.210 --> 00:10:00.500
ma tutto il resto non lo sarà.

00:10:00.500 --> 00:10:01.220
>> Ok. Bello.

00:10:01.220 --> 00:10:02.945
>> Quindi vediamo il Xamarin Profiler.

00:10:02.945 --> 00:10:06.550
È più facile comprendere
all'inizio,

00:10:06.550 --> 00:10:10.955
e ti mostra anche bello
spazio dei nomi e come la denominazione.

00:10:10.955 --> 00:10:12.815
Così puoi identificare il tuo oggetto.

00:10:12.815 --> 00:10:16.715
C'è un piccolo pulsante "Run"
e "Inizia profilo" qui.

00:10:16.715 --> 00:10:20.050
Hai bisogno di un'impresa
licenza per farlo.

00:10:20.050 --> 00:10:23.870
Ma è molto conveniente e
Vi incoraggio a farlo.

00:10:23.870 --> 00:10:25.190
Quindi, una volta fatto questo,

00:10:25.190 --> 00:10:26.825
in realtà costruisce l'applicazione con

00:10:26.825 --> 00:10:31.130
alcuni metadati aggiuntivi e
codice incorporato nell'app.

00:10:31.130 --> 00:10:33.580
Così abbiamo potuto vedere e
tracciare gli oggetti.

00:10:33.580 --> 00:10:36.140
>> Ora una cosa, mentre questo
sta costruendo e dispiegando è,

00:10:36.140 --> 00:10:38.030
stiamo correndo su un
simulatore che significa che

00:10:38.030 --> 00:10:40.520
ha tutta la potenza di questo.

00:10:40.520 --> 00:10:45.320
Va bene che lo sto facendo
e profilarlo sul mio dispositivo,

00:10:45.320 --> 00:10:49.150
o è meglio farlo su un
iPhone fisico, per esempio?

00:10:49.150 --> 00:10:50.570
>> Questa è una buona domanda perché si

00:10:50.570 --> 00:10:52.340
può fare diversi tipi di profilazione.

00:10:52.340 --> 00:10:52.940
>> Interessante.

00:10:52.940 --> 00:10:54.230
>> Se si sta profilando CPU,

00:10:54.230 --> 00:10:56.480
non è una buona idea
per farlo sul simulatore

00:10:56.480 --> 00:10:58.820
perché non hai il
piena potenza del dispositivo.

00:10:58.820 --> 00:11:01.340
Ma se stai facendo un ricordo
profiler e allocazione,

00:11:01.340 --> 00:11:04.355
si otterranno gli stessi problemi
sul simulatore e sul dispositivo.

00:11:04.355 --> 00:11:04.730
>> Perfetto.

00:11:04.730 --> 00:11:10.300
>> Mi piace farlo sul portatile
perché inizia più velocemente.

00:11:10.300 --> 00:11:13.010
Non traduce il codice

00:11:13.010 --> 00:11:16.085
in istruzioni native e solo
simula ed esegue istantaneamente.

00:11:16.085 --> 00:11:18.470
Quindi, ogni volta che si fa la profilazione della memoria,

00:11:18.470 --> 00:11:20.180
se si eseguono applicazioni così tante volte,

00:11:20.180 --> 00:11:23.045
quindi ti piacerà.

00:11:23.045 --> 00:11:25.085
Fammi fare lo stesso test.

00:11:25.085 --> 00:11:27.980
Così ho aperto la pagina Dettagli una volta,

00:11:27.980 --> 00:11:29.840
e vedete questo piccolo picco qui.

00:11:29.840 --> 00:11:33.590
Significa che abbiamo aumentato la nostra
l'utilizzo della memoria in modo significativo.

00:11:33.590 --> 00:11:35.915
Ma non si vede questo
aumento della memoria qui.

00:11:35.915 --> 00:11:38.510
E 'ancora come l'oggetto più grande è

00:11:38.510 --> 00:11:40.730
sistema e da qualche parte qui.

00:11:40.730 --> 00:11:43.155
Lasciamelo fare un altro paio di volte.

00:11:43.155 --> 00:11:45.815
Lo aumenterò di nuovo.

00:11:45.815 --> 00:11:47.610
Vedrete il picco qui,

00:11:47.610 --> 00:11:49.735
ma non si vede alcun picco qui.

00:11:49.735 --> 00:11:53.330
Il che significa che quando allochiamo
in qualcosa nella memoria nativa,

00:11:53.330 --> 00:11:56.220
non riflette
nel mondo gestito,

00:11:56.220 --> 00:11:59.419
ma vediamo che la memoria totale è
in crescita e non dislocando,

00:11:59.419 --> 00:12:00.720
che è la cosa più importante.

00:12:00.720 --> 00:12:01.455
>> Vedo.

00:12:01.455 --> 00:12:04.015
>> Torniamo con questa istantanea.

00:12:04.015 --> 00:12:05.710
Snapshot di memoria effettivamente viene eseguito

00:12:05.710 --> 00:12:07.875
l'operazione di garbage collection
sul sito gestito.

00:12:07.875 --> 00:12:10.195
Quindi facciamo questa istantanea.
Ne farò un altro.

00:12:10.195 --> 00:12:11.755
Lo spiegherò più tardi,

00:12:11.755 --> 00:12:14.500
per affrontare il segnale di finalizzazione.

00:12:14.500 --> 00:12:17.475
Ma fondamentalmente, ora è la memoria pulita.

00:12:17.475 --> 00:12:19.605
Faremo in modo che
il nostro raccoglitore di rifiuti

00:12:19.605 --> 00:12:22.270
già eseguito e deallocato
tutto l'oggetto acquisito.

00:12:22.270 --> 00:12:23.920
Vediamo ancora i ricordi lì.

00:12:23.920 --> 00:12:25.845
Così è ancora andato giù.

00:12:25.845 --> 00:12:28.755
Per sapere cosa sta succedendo qui,

00:12:28.755 --> 00:12:32.005
andiamo qui e
utilizzare il pulsante del filtro.

00:12:32.005 --> 00:12:35.265
Stiamo cercando di identificare
solo oggetti R,

00:12:35.265 --> 00:12:38.110
e voglio anche vedere su
gli oggetti attivi qui.

00:12:38.110 --> 00:12:40.980
Così ho colpito questo "Applica"
e voilà,

00:12:40.980 --> 00:12:43.575
vediamo due dettagli controller
appeso in memoria,

00:12:43.575 --> 00:12:47.160
anche se non lo faccio
dettagli.

00:12:47.160 --> 00:12:48.570
>> Super campione, così hai detto,

00:12:48.570 --> 00:12:50.289
trovare tutto nel mio spazio di nome,

00:12:50.289 --> 00:12:51.610
filtrare verso il basso su questo.

00:12:51.610 --> 00:12:54.820
Letteralmente quello che vediamo qui
è Detail View Controller 2.

00:12:54.820 --> 00:12:55.225
>> sì.

00:12:55.225 --> 00:12:56.650
>> Ma dovrebbe essere andato.

00:12:56.650 --> 00:13:00.015
>> Inizierò con il più grande
oggetti presenti in queste pagine.

00:13:00.015 --> 00:13:00.280
>> sì.

00:13:00.280 --> 00:13:02.865
>> E 'vero per Android pure.

00:13:02.865 --> 00:13:04.030
Basta cercare le attività,

00:13:04.030 --> 00:13:05.395
visualizzare i modelli, o qualsiasi altra cosa,

00:13:05.395 --> 00:13:07.875
perché una volta che si dispone di una vista
modello appeso in là,

00:13:07.875 --> 00:13:11.320
inizia a collegare tutti
gli altri oggetti.

00:13:11.320 --> 00:13:13.380
Tutti i servizi, tutti i binding,

00:13:13.380 --> 00:13:16.605
tutte le riequilul, e si
ottenere un sacco di memoria.

00:13:16.605 --> 00:13:17.500
>> L'ho ottenuto.

00:13:17.500 --> 00:13:19.465
>> Lasciatemi mostrare che è vero.

00:13:19.465 --> 00:13:23.260
Lo aprirò un altro
tempo, premere il "Snapshot".

00:13:23.260 --> 00:13:25.455
Vediamo tre istanze qui.

00:13:25.455 --> 00:13:28.569
Sto tornando indietro, colpendo "Snapshot",

00:13:28.569 --> 00:13:30.030
e rimane in memoria.

00:13:30.030 --> 00:13:30.660
>> Ti ho preso.

00:13:30.660 --> 00:13:32.500
>> Quindi cerchiamo di risolvere questo problema di memoria.

00:13:32.500 --> 00:13:33.700
>> Sono pronto.

00:13:33.700 --> 00:13:36.470
>> Come si potrebbe risolvere questo problema?

00:13:41.220 --> 00:13:43.525
Questa è una pagina dei dettagli,

00:13:43.525 --> 00:13:45.460
quindi abbiamo bisogno di annullare l'iscrizione
ad un evento.

00:13:45.460 --> 00:13:49.325
>> Ti ho preso. Quindi il vero problema qui
è che ho sottoscritto un evento.

00:13:49.325 --> 00:13:49.970
>> Sì.

00:13:49.970 --> 00:13:52.135
>> Allora dovremmo annullare l'iscrizione, giusto?

00:13:52.135 --> 00:13:54.550
>> Questo è corretto. Questo
è una buona pratica.

00:13:54.550 --> 00:13:56.370
Ogni volta che vedete questo più uguale,

00:13:56.370 --> 00:13:59.490
basta cercare se
c'è un meno uguale,

00:13:59.490 --> 00:14:01.980
se non lo è, si
dovrebbe introdurre che.

00:14:01.980 --> 00:14:02.595
>> L'ho ottenuto.

00:14:02.595 --> 00:14:05.020
>> Questa è la prima indicazione
che si dispone di una perdita di memoria.

00:14:05.020 --> 00:14:05.340
>> L'ho ottenuto.

00:14:05.340 --> 00:14:10.460
>> L'unica eccezione è quando
ti iscrivi alla pagina principale,

00:14:10.460 --> 00:14:12.285
come la nostra pagina principale qui,

00:14:12.285 --> 00:14:14.725
e sei sicuro che questa pagina

00:14:14.725 --> 00:14:18.010
non sarà in grado di andare
via in qualsiasi momento presto.

00:14:18.010 --> 00:14:20.115
>> Forse ce l'hai a
livelli di delegato dell'app.

00:14:20.115 --> 00:14:21.530
Tu sei come, io in realtà
vogliono che questo sia

00:14:21.530 --> 00:14:23.290
un evento globale per tutti i tempi.

00:14:23.290 --> 00:14:25.845
Ma anche quando l'app
va in background,

00:14:25.845 --> 00:14:27.295
si dovrebbe anche annullare l'iscrizione.

00:14:27.295 --> 00:14:28.345
>> Questo è vero.

00:14:28.345 --> 00:14:28.675
>> sì.

00:14:28.675 --> 00:14:29.700
>> Non eseguire.

00:14:29.700 --> 00:14:31.750
>> Così ora stai dicendo
quando appare,

00:14:31.750 --> 00:14:33.855
si iscriverà, e scomparirà,

00:14:33.855 --> 00:14:35.935
annullare l'iscrizione, e poi si
rimuovere quello in alto.

00:14:35.935 --> 00:14:37.990
>> Sì, ho rimosso dal Cloud,

00:14:37.990 --> 00:14:39.710
perché vogliamo
eseguirlo ogni volta che

00:14:39.710 --> 00:14:42.040
appaiono e ogni volta che scompaiono.

00:14:42.040 --> 00:14:43.850
Più uguale per abbonarsi,

00:14:43.850 --> 00:14:45.640
meno uguale a annullare l'iscrizione.

00:14:45.640 --> 00:14:48.735
Niente di complicato, voglio solo

00:14:48.735 --> 00:14:52.045
fare in modo che non abbiamo bisogno di
strumenti una volta che si passa attraverso di essa.

00:14:52.045 --> 00:14:52.720
>> Cool.

00:14:52.720 --> 00:14:55.110
>> Quindi sto facendo le stesse cose,

00:14:55.110 --> 00:14:59.490
andando ai dettagli,
dimostrando che è vero.

00:14:59.490 --> 00:15:02.980
Prendendo un'istantanea,
filtrare nei miei eventi.

00:15:02.980 --> 00:15:05.300
Siamo spiacenti. Ha appena cliccato.

00:15:08.700 --> 00:15:12.170
Vediamo sugli oggetti dal vivo.

00:15:12.420 --> 00:15:15.345
Dovremmo vedere i dettagli
perché siamo attualmente in

00:15:15.345 --> 00:15:17.475
pagina dei dettagli. Torniamo indietro.

00:15:17.475 --> 00:15:18.990
Abbiamo colpito una "istantanea"

00:15:18.990 --> 00:15:20.880
e cosa ci aspettiamo qui?

00:15:20.880 --> 00:15:23.715
In primo luogo, garbage collection in realtà

00:15:23.715 --> 00:15:26.065
mettere questi oggetti in
segnale di finalizzazione,

00:15:26.065 --> 00:15:27.625
ma secondo dovrebbe cue 1,

00:15:27.625 --> 00:15:30.340
o probabilmente ancora lo stesso.

00:15:30.340 --> 00:15:31.570
>> Ora è andato.

00:15:31.570 --> 00:15:33.910
>> Sì. Quindi lasciatemi parlare di

00:15:33.910 --> 00:15:36.940
segnale di finalizzazione in un
secondo, ma per ora,

00:15:36.940 --> 00:15:40.395
l'idea è che abbiamo
perso la nostra vista dettagli,

00:15:40.395 --> 00:15:43.135
e il nostro utilizzo della memoria in calo.

00:15:43.135 --> 00:15:43.770
>> Bella.

00:15:43.770 --> 00:15:46.150
>> Ecco come fissiamo le perdite di memoria.

00:15:46.150 --> 00:15:49.420
>> sì. Hai sottoscritto il tuo
Eventi. Annullare la sottoscrizione agli eventi.

00:15:49.420 --> 00:15:51.630
>> Regola generale di base.

00:15:51.630 --> 00:15:54.915
>> Questo è davvero divertente troppo
perché uno, causa due problemi.

00:15:54.915 --> 00:15:56.800
Abbiamo visto che lo stavi tenendo in vita

00:15:56.800 --> 00:15:58.750
perché questi eventi vanno avanti.

00:15:58.750 --> 00:16:00.715
Così ora si sta sparando
più volte,

00:16:00.715 --> 00:16:04.290
ma anche, qualsiasi cosa su quella pagina
sta per essere lasciato in memoria.

00:16:04.290 --> 00:16:06.685
>> Esatto. Ecco perché
abbiamo aggiunto un'immagine pesante,

00:16:06.685 --> 00:16:08.205
ed è ancora nella memoria.

00:16:08.205 --> 00:16:08.830
>> L'ho ottenuto.

00:16:08.830 --> 00:16:10.570
>> Lasciate che vi mostri strumenti.

00:16:10.570 --> 00:16:13.390
Quindi vi presento
indietro la nostra perdita di memoria.

00:16:13.390 --> 00:16:13.800
>> Certo.

00:16:13.800 --> 00:16:15.985
>> Semplicemente rimuovendo l'evento di annullamento della sottoscrizione.

00:16:15.985 --> 00:16:18.435
Ho intenzione di distribuire al mio simulatore,

00:16:18.435 --> 00:16:21.330
e gli strumenti funziona abbastanza facile.

00:16:21.330 --> 00:16:23.355
Basta scegliere il bersaglio da

00:16:23.355 --> 00:16:25.930
il simulatore e il
app, e questo è tutto.

00:16:25.930 --> 00:16:28.435
Questo è tutto ciò che serve per iniziare
il profiler Strumenti.

00:16:28.435 --> 00:16:30.175
Anche se è Xamarin App,

00:16:30.175 --> 00:16:32.150
si può iniziare a destra
dagli strumenti,

00:16:32.150 --> 00:16:33.615
che non sa nulla di Xamarin.

00:16:33.615 --> 00:16:35.310
>> Da dove provengono gli strumenti?

00:16:35.310 --> 00:16:38.709
>> Apple. Si tratta di una mela
strumento, viene fornito con Xcode,

00:16:38.709 --> 00:16:41.950
e ha un sacco di
utensili all'interno di esso.

00:16:41.950 --> 00:16:43.450
>> Quindi è appena integrato in
perché hai già

00:16:43.450 --> 00:16:45.415
Xcode installato? Così
tutti hanno questo?

00:16:45.415 --> 00:16:46.015
>> È gratuito.

00:16:46.015 --> 00:16:48.925
>> È gratuito. Bello. Quindi chiunque
può usare questo in questo momento?

00:16:48.925 --> 00:16:53.880
>> Sì. Si può effettivamente
vedi queste attività,

00:16:53.880 --> 00:16:57.920
anche se quelli creati da gestiti
mondo come l'attività dettagli,

00:16:57.920 --> 00:17:00.525
è ancora rappresentato
da un oggetto nativo.

00:17:00.525 --> 00:17:00.930
>> L'ho ottenuto.

00:17:00.930 --> 00:17:02.855
>> Quindi cerchiamo quell'oggetto.

00:17:02.855 --> 00:17:07.240
Viene chiamato Controller di visualizzazione dettagli.

00:17:07.240 --> 00:17:09.595
Permettetemi di crearne alcuni.

00:17:09.595 --> 00:17:11.030
>> Questo è in realtà
davvero cool perché

00:17:11.030 --> 00:17:12.240
Non ho mai usato strumenti,

00:17:12.240 --> 00:17:15.295
non dirlo a nessuno, da anni.

00:17:15.295 --> 00:17:18.440
Non credo che tutti stiano dando
me un dettaglio. Quindi esiste?

00:17:18.440 --> 00:17:20.070
>> Sì, esiste.

00:17:20.070 --> 00:17:22.335
>> Ha senso
perché Xamarin è nativo,

00:17:22.335 --> 00:17:23.770
in modo da creare un oggetto nativo.

00:17:23.770 --> 00:17:26.380
>> Sì. Non c'è bisogno di fare

00:17:26.380 --> 00:17:27.885
un'istantanea della memoria qui

00:17:27.885 --> 00:17:29.975
perché non abbiamo
garbage collection qui.

00:17:29.975 --> 00:17:33.780
IOS utilizza la gerarchia,
contatore di riferimento automatico.

00:17:33.780 --> 00:17:35.605
Fondamentalmente, ogni volta che
si crea un oggetto,

00:17:35.605 --> 00:17:37.065
incrementa il contatore,

00:17:37.065 --> 00:17:39.550
ogni volta che non si utilizza o

00:17:39.550 --> 00:17:42.505
si allontana dal campo di applicazione
l'utilizzo, decrementa il contatore.

00:17:42.505 --> 00:17:43.845
Una volta che il contatore è zero,

00:17:43.845 --> 00:17:46.495
l'oggetto è spazzatura, e
potrebbe essere raccolto.

00:17:46.495 --> 00:17:48.075
Quindi è abbastanza facile iniziare

00:17:48.075 --> 00:17:51.735
gli strumenti con l'app
semplicemente facendo clic su questo pulsante.

00:17:51.735 --> 00:17:53.505
Si avvia l'applicazione,

00:17:53.505 --> 00:17:55.860
ti mostra l'utilizzo della memoria qui.

00:17:55.860 --> 00:17:57.690
Apriamo la pagina Dettagli.

00:17:57.690 --> 00:18:00.425
>> Ti ho preso. Strumenti
proviene da Apple?

00:18:00.425 --> 00:18:02.040
>> Strumenti viene da Apple.

00:18:02.040 --> 00:18:03.350
È uno strumento gratuito di Apple.

00:18:03.350 --> 00:18:04.490
Puoi usarlo adesso.

00:18:04.490 --> 00:18:05.390
>> Cool.

00:18:05.390 --> 00:18:06.970
>> Vedete che abbiamo anche

00:18:06.970 --> 00:18:10.140
questo diritto footprint di memoria
qui una volta che apriamo la pagina Dettagli.

00:18:10.140 --> 00:18:12.120
Apriamolo un'altra volta.

00:18:12.120 --> 00:18:15.140
>> Quindi questo è molto simile
al profiler Diamarin,

00:18:15.140 --> 00:18:16.870
ma questo ci sta mostrando

00:18:16.870 --> 00:18:19.240
lo stack nativo per tutti
finalità e scopi.

00:18:19.240 --> 00:18:21.500
>> Esatto. Purtroppo,

00:18:21.500 --> 00:18:24.090
non sa nulla
Xamarin e mondo gestito,

00:18:24.090 --> 00:18:27.025
in modo da non essere in grado di vedere
l'oggetto gestito che ha creato.

00:18:27.025 --> 00:18:28.990
Così vedete il picco,

00:18:28.990 --> 00:18:30.850
e vedete che non scompare.

00:18:30.850 --> 00:18:33.350
Quindi fammelo fare una terza volta,

00:18:33.350 --> 00:18:35.145
e basta mostrare gli oggetti.

00:18:35.145 --> 00:18:38.455
Quindi vediamo. C'è
un piccolo pulsante di filtro.

00:18:38.455 --> 00:18:43.170
Andiamo a tutte le allocazioni qui,

00:18:43.170 --> 00:18:45.165
e ha colpito il "Dettagli".

00:18:45.165 --> 00:18:45.820
>> Ok.

00:18:45.820 --> 00:18:47.555
>> Questo è tre pagine proprio qui,

00:18:47.555 --> 00:18:48.660
sono tutti in memoria,

00:18:48.660 --> 00:18:50.650
e si allocano in memoria.

00:18:50.650 --> 00:18:54.070
Non mostrerò come deallocatemo
perché è la stessa correzione,

00:18:54.070 --> 00:18:57.020
abbiamo appena annullare l'iscrizione,
mondo gestito annulla l'iscrizione

00:18:57.020 --> 00:19:00.120
dall'oggetto. Oggetto
considerati spazzatura.

00:19:00.120 --> 00:19:04.660
Poi il nostro raccoglitore di rifiuti
raccoglie tali informazioni,

00:19:04.660 --> 00:19:06.460
poi nativo può raccogliere
perché nulla

00:19:06.460 --> 00:19:08.490
da gestire il mondo
già tenendo a questo.

00:19:08.490 --> 00:19:10.780
>> Ha senso. Quindi molto
più o meno la stessa correzione,

00:19:10.780 --> 00:19:12.255
ma un altro modo per rilevarlo.

00:19:12.255 --> 00:19:15.045
>> Esatto. Quindi questo è

00:19:15.045 --> 00:19:19.345
sulle differenze tra
gestito e nativo.

00:19:19.345 --> 00:19:22.120
I miei prossimi esempi saranno
essere per lo più di gestito

00:19:22.120 --> 00:19:25.320
mondo perché si può
introdurre problema in qualsiasi,

00:19:25.320 --> 00:19:26.905
e non è legato a Xamarin.

00:19:26.905 --> 00:19:29.570
Come hai detto tu, potrebbe essere
sottoscrivendo eventi statici,

00:19:29.570 --> 00:19:32.745
potrebbe introdurre
problema anche ovunque.

00:19:32.745 --> 00:19:35.410
Quindi la prossima cosa è

00:19:35.410 --> 00:19:38.210
sull'abbonamento, e
senza annullamenti gli abbonamenti.

00:19:38.210 --> 00:19:39.315
Ma in questo caso,

00:19:39.315 --> 00:19:42.820
siamo in realtà
abbonando implicitamente,

00:19:42.820 --> 00:19:44.480
non usiamo più uguale.

00:19:44.480 --> 00:19:46.015
Quindi è più difficile da trovare.

00:19:46.015 --> 00:19:48.710
In questo caso, eseguiamo questo
centro di notifica cercando di

00:19:48.710 --> 00:19:51.795
identificare ogni volta che la nostra applicazione viene ruotata.

00:19:51.795 --> 00:19:53.695
Aggiungiamo in questo osservatore.

00:19:53.695 --> 00:19:57.525
Si tratta di un centro predefinito singleton.

00:19:57.525 --> 00:19:59.700
Stiamo dicendo che, voglio ottenere

00:19:59.700 --> 00:20:02.595
qualsiasi informazione ogni volta che
orientamento cambiato,

00:20:02.595 --> 00:20:04.140
ed ecco il mio gestore per questo.

00:20:04.140 --> 00:20:04.650
>> L'ho ottenuto.

00:20:04.650 --> 00:20:06.690
>> Il gestore stesso,
è abbastanza facile.

00:20:06.690 --> 00:20:08.125
Non faremo nulla lì,

00:20:08.125 --> 00:20:11.665
ci limiteremo a stamparlo per eseguire il debug.

00:20:11.665 --> 00:20:12.465
>> L'ho ottenuto.

00:20:12.465 --> 00:20:15.525
>> Fammi rimuovere il
roba connettività perché

00:20:15.525 --> 00:20:18.630
vogliamo introdurre diversi
tipi di problemi di memoria.

00:20:18.630 --> 00:20:21.525
Commento anche il nostro
immagine perché non abbiamo bisogno

00:20:21.525 --> 00:20:24.430
per mostrare la memoria
impronta, è lì.

00:20:24.430 --> 00:20:28.390
Sperimenteremo solo con
Controller di visualizzazione dell'interfaccia utente e visualizzazioni.

00:20:28.390 --> 00:20:30.650
>> Molto fresco. Quindi questo
è molto simile,

00:20:30.650 --> 00:20:32.870
ma questo schema, si
potrebbe sottoscrivere,

00:20:32.870 --> 00:20:34.605
forse anche passando in un'azione.

00:20:34.605 --> 00:20:38.340
O in questo caso, cosa fa
dice che ecco la tua chiamata.

00:20:38.340 --> 00:20:40.010
I delegati sono molto simili,

00:20:40.010 --> 00:20:41.115
Penso a questo modello.

00:20:41.115 --> 00:20:42.480
Quindi è solo qualcosa
Ci sono abituato anch'io.

00:20:42.480 --> 00:20:45.590
>> Esatto. Questo è stato

00:20:45.590 --> 00:20:47.864
la loro idea principale perché
quando ti iscrivi,

00:20:47.864 --> 00:20:51.405
si sta passando il riferimento a
controller di visualizzazione dell'interfaccia utente.

00:20:51.405 --> 00:20:53.425
Questo è solo un diverso
modo per passare il riferimento.

00:20:53.425 --> 00:20:55.260
A volte non è così ovvio.

00:20:55.260 --> 00:20:57.955
Quindi abbiamo il nostro abbonamento,
è in esecuzione qui.

00:20:57.955 --> 00:20:59.305
Funziona solo una volta.

00:20:59.305 --> 00:21:01.780
Chiudiamolo e riapriamolo.

00:21:01.780 --> 00:21:03.525
Ora, abbiamo un doppio clic.

00:21:03.525 --> 00:21:05.230
Lasciate che vi dica questo.

00:21:05.230 --> 00:21:07.240
Rotazione una volta, ottenendo due,

00:21:07.240 --> 00:21:11.655
il che significa che abbiamo una qualche vista dell'interfaccia utente
Controller appeso in memoria,

00:21:11.655 --> 00:21:13.535
mentre ancora l'elaborazione del primo.

00:21:13.535 --> 00:21:13.980
>> L'ho ottenuto.

00:21:13.980 --> 00:21:15.430
>> Potrebbe essere un problema se si dispone di

00:21:15.430 --> 00:21:19.660
alcuni database di aggiornamento della logica
o richiedere HTTP straordinario.

00:21:19.660 --> 00:21:21.340
Come in un giorno di utilizzo,

00:21:21.340 --> 00:21:24.810
l'app non viene uccisa,
disattivare, riattivare.

00:21:24.810 --> 00:21:26.740
Avrà tutto questo
Vedi ancora in memoria,

00:21:26.740 --> 00:21:28.265
e in una settimana, potrebbe bloccarsi.

00:21:28.265 --> 00:21:28.785
>> sì.

00:21:28.785 --> 00:21:30.105
>> Quindi, come risolvere questo problema?

00:21:30.105 --> 00:21:31.550
È molto facile.

00:21:31.550 --> 00:21:34.145
>> Presumo che si annulla l'iscrizione?

00:21:34.145 --> 00:21:35.835
>> Esatto. È più difficile

00:21:35.835 --> 00:21:38.685
annullare l'iscrizione perché si
non hanno più uguale.

00:21:38.685 --> 00:21:42.010
Lasciate che vi mostri anche quello che
effettivamente inviare qui.

00:21:42.010 --> 00:21:43.365
Quindi, quando ti iscrivi,

00:21:43.365 --> 00:21:46.395
si sta passando il nome del metodo.

00:21:46.395 --> 00:21:48.215
In realtà stai passando un'azione,

00:21:48.215 --> 00:21:51.745
e il compilatore sta facendo un
grande lavoro di nasconderlo,

00:21:51.745 --> 00:21:54.150
e rendere la nostra vita più facile.

00:21:54.150 --> 00:21:55.945
>> Il compilatore è molto bello.

00:21:55.945 --> 00:21:57.255
>> Molto gentile con noi.

00:21:57.255 --> 00:22:00.415
Ecco perché ci piace essere sviluppatori.

00:22:00.415 --> 00:22:04.360
Quindi in realtà chiede
azione con NSNotification.

00:22:04.360 --> 00:22:07.840
Quindi sto firmando NSNotification qui,

00:22:07.840 --> 00:22:13.365
e poi usando questa notazione,
incollare questo oggetto.

00:22:13.365 --> 00:22:16.560
Quindi, invece del nome del metodo,

00:22:16.560 --> 00:22:19.225
stiamo effettivamente passando
un'azione e un oggetto,

00:22:19.225 --> 00:22:20.960
che contiene il riferimento alla

00:22:20.960 --> 00:22:23.610
questi metadati su come
per chiamare il metodo.

00:22:23.610 --> 00:22:26.555
Quindi non passiamo il metodo,
è solo un riferimento.

00:22:26.555 --> 00:22:30.060
Nel nostro caso, il più importante
parte quando si passa questo riferimento,

00:22:30.060 --> 00:22:32.155
che è il controller UIV,

00:22:32.155 --> 00:22:34.170
ed è per questo che è tenuto in memoria.

00:22:34.170 --> 00:22:35.260
>> L'ho ottenuto.

00:22:35.260 --> 00:22:35.865
>> Ok.

00:22:35.865 --> 00:22:36.670
>> Ha senso. Sì.

00:22:36.670 --> 00:22:38.595
>> Non mostrerò i dettagli

00:22:38.595 --> 00:22:40.390
perché la memoria
perdita è ancora lì

00:22:40.390 --> 00:22:43.975
perché abbiamo visto questi
cosa per risparmiare un po 'di tempo.

00:22:43.975 --> 00:22:45.500
Voglio concentrarmi su

00:22:45.500 --> 00:22:48.830
lo scenario peggiore che
si dovrebbe essere consapevoli di.

00:22:48.830 --> 00:22:54.250
Quando il mondo nativo non posiziona
bene con il mondo gestito.

00:22:54.250 --> 00:22:56.280
>> Ti ho preso. Quando il
due mondi si scontrano.

00:22:56.280 --> 00:23:00.265
>> Questo è corretto perché ogni volta che
abbiamo gestito oggetti creati,

00:23:00.265 --> 00:23:02.155
e c'è un oggetto nativo creato,

00:23:02.155 --> 00:23:05.690
e lui/lei cercando di
deallocare oggetti nativi,

00:23:05.690 --> 00:23:07.495
il nostro mondo gestito pensa,

00:23:07.495 --> 00:23:09.330
Non ho ancora finito con questo oggetto.

00:23:09.330 --> 00:23:11.270
Si prega di tenere premuto, non

00:23:11.270 --> 00:23:13.765
raccogliere l'oggetto perché
Ci sto ancora lavorando.

00:23:13.765 --> 00:23:14.525
>> Ti ho preso.

00:23:14.525 --> 00:23:15.805
>> Potrebbe essere opposto,

00:23:15.805 --> 00:23:19.130
quando un mondo nativo
potrebbe creare un oggetto,

00:23:19.130 --> 00:23:20.265
e ora un mondo gestito pensa,

00:23:20.265 --> 00:23:22.450
non è fatto, ancora
lì, quindi teniamo.

00:23:22.450 --> 00:23:25.015
Anche se non si dispone di altri
riferimenti a questo oggetto,

00:23:25.015 --> 00:23:29.015
potrebbe tenerlo, potrebbe
tenerlo non come spazzatura.

00:23:29.015 --> 00:23:29.820
>> Ti ho preso.

00:23:29.820 --> 00:23:31.460
>> Potrei spiegarlo con

00:23:31.460 --> 00:23:34.640
questi piccoli piccoli immagini
di oggetti immortali.

00:23:34.640 --> 00:23:37.230
Quindi non creare immortali
Oggetti. Sono brutte.

00:23:37.230 --> 00:23:38.435
>> Sembra cool.

00:23:38.435 --> 00:23:39.963
>> sì.

00:23:39.963 --> 00:23:43.355
Succede quando si
hanno questi due mondi.

00:23:43.355 --> 00:23:46.925
Nativo, si vede a destra il
controller e viste di visualizzazione nativi,

00:23:46.925 --> 00:23:49.640
e da sinistra hai

00:23:49.640 --> 00:23:52.580
gestito mondo C Sharp che è
Visualizza controller e viste.

00:23:52.580 --> 00:23:55.640
Ogni volta che non sai cos'è
accadendo sul mondo nativo,

00:23:55.640 --> 00:23:58.070
non è possibile raccogliere
da questo mondo.

00:23:58.070 --> 00:24:00.905
Vi mostrerò un esempio
come si può fare.

00:24:00.905 --> 00:24:03.275
Così nel mio esempio,

00:24:03.275 --> 00:24:07.235
Voglio aggiungere qui un piccolo
piccolo pulsante "Salva",

00:24:07.235 --> 00:24:11.375
e voglio solo chiudere il
Visualizza una volta che l'utente lo raggiunge.

00:24:11.375 --> 00:24:13.925
Supponiamo che il
"Salva" farà anche

00:24:13.925 --> 00:24:17.330
un database logico di salvataggio
o chiamate HTTP qualunque cosa,

00:24:17.330 --> 00:24:19.055
semplicemente non tornare indietro

00:24:19.055 --> 00:24:22.145
ed esegue effettivamente
qualche azione aggiuntiva.

00:24:22.145 --> 00:24:22.775
>> Ok.

00:24:22.775 --> 00:24:24.980
>> Come dettagli di questi pulsanti,

00:24:24.980 --> 00:24:26.300
inviamo il gestore.

00:24:26.300 --> 00:24:31.205
Questo gestore sta dicendo che
chiudere il controller.

00:24:31.205 --> 00:24:33.395
>> Sembra perfettamente legittimo per me.

00:24:33.395 --> 00:24:35.255
>> Sì. Introdurremo
una perdita di memoria.

00:24:35.255 --> 00:24:36.230
>> Ok.

00:24:36.230 --> 00:24:42.515
>> Sei cattivo. Purtroppo sarà
ed è un modello comune.

00:24:42.515 --> 00:24:45.005
Noi non abbiamo alcun
evento statico come qui.

00:24:45.005 --> 00:24:47.195
Non abbiamo
singolo tono come qui.

00:24:47.195 --> 00:24:49.025
Teniamo questo bottone qui,

00:24:49.025 --> 00:24:51.650
questo è solo un elemento locale.

00:24:51.650 --> 00:24:54.260
Va bene James, ora abbiamo
ha creato un pulsante e

00:24:54.260 --> 00:24:56.735
vogliamo aggiungerlo a
la nostra vista di navigazione.

00:24:56.735 --> 00:25:00.440
Così abbiamo detto in esso attraverso il
elemento di navigazione anche non utilizzare

00:25:00.440 --> 00:25:05.225
eventuali riferimenti statici nulla
così e solo esso.

00:25:05.225 --> 00:25:08.015
Ora abbiamo il pulsante sub
e avviiamo il profiler.

00:25:08.015 --> 00:25:09.890
>> sì e di nuovo,
modello super simile.

00:25:09.890 --> 00:25:11.285
Creo un pulsante,

00:25:11.285 --> 00:25:15.800
aggiungere un pulsante, e poi faccio scoppiare il
View Controller sembra normale.

00:25:15.800 --> 00:25:18.185
>> Avere un delegato che non utilizza

00:25:18.185 --> 00:25:20.540
qualsiasi riferimento esterno o statico

00:25:20.540 --> 00:25:23.225
e non passa alcun riferimento
dal nostro controller.

00:25:23.225 --> 00:25:23.750
>> Ti ho preso.

00:25:23.750 --> 00:25:27.090
>> Dovrebbe funzionare bene,
va bene? Vediamo.

00:25:27.280 --> 00:25:32.780
Così profiler mostrerà gli oggetti

00:25:32.780 --> 00:25:34.760
creato all'inizio e io sono

00:25:34.760 --> 00:25:37.790
intenzione di iniziare il monitoraggio
all'inizio.

00:25:37.790 --> 00:25:39.530
Così ho nascosto le istantanee a destra

00:25:39.530 --> 00:25:42.455
ora e filtrando solo i miei oggetti.

00:25:42.455 --> 00:25:45.380
Ancora una volta è molto comune
modello per la risoluzione dei problemi

00:25:45.380 --> 00:25:48.800
problemi di memoria solo per
vedere solo i miei oggetti.

00:25:48.800 --> 00:25:52.235
Allora me ne vado una volta.
Questo è il mio bottone.

00:25:52.235 --> 00:25:55.565
Vedete, questo è un nuovo controllo
bene la nostra applicazione.

00:25:55.565 --> 00:25:56.870
Abbiamo questo in memoria,

00:25:56.870 --> 00:25:58.745
che è vero, ci aspettiamo che.

00:25:58.745 --> 00:26:03.410
Tornando indietro, colpiamo uno
più tempo e un'altra volta.

00:26:03.410 --> 00:26:04.430
>> Ancora una volta perché lo so.

00:26:04.430 --> 00:26:05.195
>> Ancora una volta.

00:26:05.195 --> 00:26:06.380
>> Ok, e ancora lì.

00:26:06.380 --> 00:26:08.270
>> Ancora una volta, è ancora lì.

00:26:08.270 --> 00:26:11.030
Quindi apriamolo e molte più volte.

00:26:11.030 --> 00:26:14.090
Chiudiamolo anche
modo diverso di tornare indietro,

00:26:14.090 --> 00:26:17.390
intenzione di salvare, in realtà
fondamentalmente facendo lo stesso.

00:26:17.390 --> 00:26:20.090
Facciamo un'azione nella memoria
istantanea" un altro

00:26:20.090 --> 00:26:22.610
tempo e oh wow abbiamo
avere cinque istanze di

00:26:22.610 --> 00:26:24.920
pagine appese lì in
memoria e se si dispone di

00:26:24.920 --> 00:26:28.130
un'immagine enorme lì
avrà un sacco di memoria

00:26:28.130 --> 00:26:28.550
>> L'ho ottenuto.

00:26:28.550 --> 00:26:32.615
>> Quindi questo è un modello molto comune

00:26:32.615 --> 00:26:36.800
perché non è ovvio che
si ha una perdita di memoria qui.

00:26:36.800 --> 00:26:39.830
Il problema qui è
che UIBarButtonItem

00:26:39.830 --> 00:26:43.910
in realtà detiene a
qualche risorsa nativa,

00:26:43.910 --> 00:26:45.485
è associato alla risorsa nativa.

00:26:45.485 --> 00:26:49.100
Se non diciamo chiaramente che
Non ho più bisogno di questo pulsante,

00:26:49.100 --> 00:26:51.020
si introdurrà
questo oggetto immortale.

00:26:51.020 --> 00:26:53.135
>> Ti ho preso. Quindi, come fare
Risolvo questa cosa?

00:26:53.135 --> 00:26:56.240
>> Per risolvere questo, usiamo

00:26:56.240 --> 00:26:59.900
il nostro evento ViewDisappear e
fare qualcosa con il nostro pulsante.

00:26:59.900 --> 00:27:00.150
>> Ok.

00:27:00.150 --> 00:27:01.220
>> Quindi abbiamo due opzioni,

00:27:01.220 --> 00:27:02.735
potremmo usare sia

00:27:02.735 --> 00:27:05.299
Evento su cui si è fatto clic e
sottoscrizione e annullamento dell'iscrizione,

00:27:05.299 --> 00:27:07.160
ma torneremo a

00:27:07.160 --> 00:27:10.400
il nostro primo elemento quando ci iscriviamo
senza annullare l'iscrizione.

00:27:10.400 --> 00:27:12.560
Facciamo qualcosa di più interessante.

00:27:12.560 --> 00:27:14.030
Ci limiteremo a smaltire il pulsante.

00:27:14.030 --> 00:27:15.680
>> Mi piace. Sono
fatto con esso, giusto?

00:27:15.680 --> 00:27:18.320
>> Sì, abbiamo tipo di dire
mondo gestito che,

00:27:18.320 --> 00:27:20.495
"Ho finito con il pulsante
si prega di smaltire.

00:27:20.495 --> 00:27:24.365
Non è ovvio perché
un sacco di viste e wrapper

00:27:24.365 --> 00:27:26.540
in Xamarin iOS hanno
questo metodo dispose e

00:27:26.540 --> 00:27:29.015
non si sa davvero ogni volta che
si dovrebbe chiamare così.

00:27:29.015 --> 00:27:30.815
Quindi è un caso interessante.

00:27:30.815 --> 00:27:32.975
Ma facciamolo e corriamo.

00:27:32.975 --> 00:27:34.700
Questa è l'unica azione che ho aggiunto

00:27:34.700 --> 00:27:37.500
dall'esecuzione dell'applicazione precedente.

00:27:38.290 --> 00:27:42.530
Sto iniziando il profiler
e facendo lo stesso caso d'uso.

00:27:42.530 --> 00:27:44.000
Stiamo andando a monitorare gli oggetti da

00:27:44.000 --> 00:27:46.310
l'inizio e fare
assicurarsi che siano smaltiti.

00:27:46.310 --> 00:27:48.050
>> Molto fresco. Questo è bello.

00:27:48.050 --> 00:27:49.670
Così avresti potuto, come hai detto,

00:27:49.670 --> 00:27:53.270
invece di passare
che l'intera azione in,

00:27:53.270 --> 00:27:55.130
si può solo simile a come abbiamo

00:27:55.130 --> 00:27:57.605
fare connettività,
sottoscrizione, annullamento dell'iscrizione,

00:27:57.605 --> 00:28:00.590
L'avrei immaginato
fuori, ma in questo caso,

00:28:00.590 --> 00:28:03.125
sei già fatto così
basta smaltirlo.

00:28:03.125 --> 00:28:04.010
>> Esatto.

00:28:04.010 --> 00:28:04.875
>> Cool.

00:28:04.875 --> 00:28:08.455
>> Sì, perché non lo facciamo
si aspettano che venga annullato l'iscrizione.

00:28:08.455 --> 00:28:10.840
Non è una specie di abbonamento,

00:28:10.840 --> 00:28:14.230
abbiamo appena passare e delegare
all'interno dell'oggetto locale.

00:28:14.230 --> 00:28:16.045
In caso di NotificationCenter,

00:28:16.045 --> 00:28:18.790
è una specie di abbonamento perché
passiamo nell'oggetto locale

00:28:18.790 --> 00:28:21.760
in alcuni statici
un'istanza o un singleton.

00:28:21.760 --> 00:28:24.760
In questo caso, abbiamo appena usato
nelle nostre risorse locali,

00:28:24.760 --> 00:28:26.395
non ci aspettiamo una perdita di memoria.

00:28:26.395 --> 00:28:26.680
>> Ti ho preso.

00:28:26.680 --> 00:28:28.630
>> Ma purtroppo posso vedere

00:28:28.630 --> 00:28:32.660
questa barriera molto e la gente
entrare in queste situazioni.

00:28:32.680 --> 00:28:37.530
Quindi facciamo lo stesso trucco.

00:28:37.750 --> 00:28:41.760
Vorrei che potesse salvare questi dati.

00:28:41.950 --> 00:28:46.310
Quindi abbiamo una sola vista
Controllore e delegato.

00:28:46.310 --> 00:28:48.290
Premiamo "Salva".

00:28:48.290 --> 00:28:51.215
Torniamo.

00:28:51.215 --> 00:28:54.005
Restiamo alla pagina dei dettagli.

00:28:54.005 --> 00:28:56.975
Premi "Memory snapshot" e ne vediamo uno.

00:28:56.975 --> 00:28:59.315
Permettetemi di fare clic un paio di volte.

00:28:59.315 --> 00:29:02.735
Ne parleremo. Quindi abbiamo
hanno solo un esempio qui.

00:29:02.735 --> 00:29:10.805
Faccio clic su "Salva", faccio clic su "Istantanea"
e scompare la scansione.

00:29:10.805 --> 00:29:12.380
ok? Perdita di memoria fissa.

00:29:12.380 --> 00:29:13.250
>> Molto cool. Bello.

00:29:13.250 --> 00:29:14.900
>> Oggetto immortale è stato ucciso.

00:29:14.900 --> 00:29:16.445
>> Ucciso. Molto figo.

00:29:16.445 --> 00:29:17.810
In caso contrario, questo è impressionante.

00:29:17.810 --> 00:29:20.600
Così molto semplice, guarda i tuoi eventi,

00:29:20.600 --> 00:29:22.850
ma anche guardare a come si sta passando

00:29:22.850 --> 00:29:24.890
queste azioni intorno e anche io

00:29:24.890 --> 00:29:26.870
non sarebbe nemmeno pensare a questo
pulsante per essere onesti con voi

00:29:26.870 --> 00:29:29.315
perché il costruttore
sta passando questa cosa.

00:29:29.315 --> 00:29:29.600
>> Sì.

00:29:29.600 --> 00:29:30.725
>> Così molto cool.

00:29:30.725 --> 00:29:33.350
>> Consiglierei anche di

00:29:33.350 --> 00:29:36.425
i nostri sviluppatori di usarlo di più
spesso come una volta alla settimana,

00:29:36.425 --> 00:29:39.545
ogni sprint e poi per
vedere l'utilizzo della memoria,

00:29:39.545 --> 00:29:41.585
è possibile visualizzarlo come un'esecuzione dei test dell'interfaccia utente.

00:29:41.585 --> 00:29:45.590
Mostra questo piccolo
working set di memoria.

00:29:45.590 --> 00:29:48.050
Così basta vedere oltre
mesi se è cresce o

00:29:48.050 --> 00:29:51.530
non e se ti cresce
probabilmente hanno una perdita di memoria.

00:29:51.530 --> 00:29:53.360
>> Hai mostrato iOS.

00:29:53.360 --> 00:29:54.560
Ora che dire per Android?

00:29:54.560 --> 00:29:57.500
C'è qualche altro specifico
strumenti che è possibile utilizzare?

00:29:57.500 --> 00:29:59.465
>> E 'una grande domanda
perché, Android,

00:29:59.465 --> 00:30:02.000
tutto quello di cui abbiamo parlato
iOS si applica per Android.

00:30:02.000 --> 00:30:02.150
>> Ti ho preso.

00:30:02.150 --> 00:30:03.440
>> Basta avere strumento diverso per

00:30:03.440 --> 00:30:07.145
Profiler nativo Android
chiamato Android Profiler.

00:30:07.145 --> 00:30:08.390
E 'davvero cool.

00:30:08.390 --> 00:30:09.740
Ti mostra un sacco di

00:30:09.740 --> 00:30:12.380
informazioni, ma avete ancora
di doverlo usare chi è

00:30:12.380 --> 00:30:14.330
il profiler Xamarin in congiunzione

00:30:14.330 --> 00:30:16.790
a causa di gestito
mondo nativo.

00:30:16.790 --> 00:30:17.930
>> Ti ho preso. Semplicemente

00:30:17.930 --> 00:30:19.340
suoni è stato bello che
ci sono grandi strumenti

00:30:19.340 --> 00:30:22.400
disponibile non importa dove
sei a, iOS, Android.

00:30:22.400 --> 00:30:23.240
>> Esatto.

00:30:23.240 --> 00:30:24.005
>> Posso andare avanti e farlo.

00:30:24.005 --> 00:30:25.820
Onestamente, solo guardando
in alcuni di questi,

00:30:25.820 --> 00:30:28.160
Sono abbastanza sicuro che il mio codice,
ci sono un sacco di cose brutte.

00:30:28.160 --> 00:30:29.480
Così, quando vado in streaming,

00:30:29.480 --> 00:30:31.790
sta andando essere tutto
correggere le perdite di memoria.

00:30:31.790 --> 00:30:32.180
>> Ok.

00:30:32.180 --> 00:30:34.280
>> Molto fresco. Qualsiasi altra cosa Alexi
di cui vuoi parlare?

00:30:34.280 --> 00:30:35.315
>> Che tutto per oggi.

00:30:35.315 --> 00:30:37.865
>> Fantastico. Beh, grazie
tutti per la messa a punto.

00:30:37.865 --> 00:30:40.010
Alexi, grazie mille per
mostrando tutta questa roba.

00:30:40.010 --> 00:30:42.305
>> Grazie ragazzi. Grazie
voi James per avermi lasciato.

00:30:42.305 --> 00:30:43.970
>> Assolutamente, e assicurarsi

00:30:43.970 --> 00:30:45.920
che si controlla tutti
le note mostra qui sotto,

00:30:45.920 --> 00:30:47.420
aprire tutta la fonte
codice, tutti i link

00:30:47.420 --> 00:30:48.980
per tutta la documentazione laggiù.

00:30:48.980 --> 00:30:51.740
Puoi anche andare a aka.ms/Xamarin

00:30:51.740 --> 00:30:54.485
per l'intera serie.

00:30:54.485 --> 00:30:55.790
Quindi assicuratevi di sottoscrivere

00:30:55.790 --> 00:30:57.695
oggi ovunque tu sia
guardando in questo momento.

00:30:57.695 --> 00:30:59.090
Sono James Montemagno.

00:30:59.090 --> 00:31:01.790
Questo è stato The Xamarin
Mostra e grazie per la visione.

00:31:01.790 --> 00:31:02.480
>> Grazie ragazzi.

00:31:02.480 --> 00:31:09.230
[MUSICA]

00:31:09.230 --> 00:31:11.120
>> Ehi, James qui.
Volevo solo fare il check-in

00:31:11.120 --> 00:31:13.175
e grazie per
guardando questo video.

00:31:13.175 --> 00:31:16.265
Ora fate tutte le cose che
so che si vuole fare come come,

00:31:16.265 --> 00:31:18.710
abbonarsi, e ding
quella campana di notifica,

00:31:18.710 --> 00:31:20.825
diventare parte del
squadra di notifica.

00:31:20.825 --> 00:31:22.190
Mentre sei qui, dai un'occhiata

00:31:22.190 --> 00:31:25.400
tutti questi video impressionante
che ho già codificato.

00:31:25.400 --> 00:31:29.040
Clicca su quella cosa. Fare clic su
guardarlo, farlo.

