WEBVTT

00:00:00.000 --> 00:00:01.680
- Syntonisez-vous de la semaine de cette semaine
Xamarin Show où

00:00:01.680 --> 00:00:03.360
mon bon ami Alexi sur parler

00:00:03.360 --> 00:00:06.810
sur la gestion de la mémoire pour
vos applications. Alors syntonisez-vous.

00:00:06.810 --> 00:00:13.200
[MUSIQUE]

00:00:13.200 --> 00:00:14.280
Bienvenue, tout le monde,

00:00:14.280 --> 00:00:15.405
au Xamarin Show.

00:00:15.405 --> 00:00:16.650
Je suis ton hôte James Montemagno.

00:00:16.650 --> 00:00:17.820
Aujourd'hui, mon meilleur ami

00:00:17.820 --> 00:00:21.270
le monde entier Alexi avec
Moi. Comment ça se passe, mon pote ?

00:00:21.270 --> 00:00:22.905
Je vais bien. Et toi?

00:00:22.905 --> 00:00:24.960
Je fais de la fantastique.
C'est une belle jour née

00:00:24.960 --> 00:00:26.640
ici à Redmond, Washington tous les jours.

00:00:26.640 --> 00:00:27.325
C'est le si.

00:00:27.325 --> 00:00:29.085
Maintenant, vous êtes de notre mobile

00:00:29.085 --> 00:00:31.065
conseil à la clientèle
l'équipe, est-ce exact?

00:00:31.065 --> 00:00:31.920
C'est exact.

00:00:31.920 --> 00:00:33.450
Alors, qu'est-ce que ça veut dire ?

00:00:33.450 --> 00:00:35.370
Cela signifie que nous travaillons avec

00:00:35.370 --> 00:00:38.250
nos clients et nous
les conseiller évidemment.

00:00:38.250 --> 00:00:41.645
Mais surtout, nous travaillons avec des développeurs
et voir comment ils utilisent les outils,

00:00:41.645 --> 00:00:44.300
comment ils fonctionnent avec notre outil Xamarin,

00:00:44.300 --> 00:00:47.560
et quels sont les
pièges qu'ils rencontrent.

00:00:47.560 --> 00:00:48.420
Parfait.

00:00:48.420 --> 00:00:50.205
Aujourd'hui, je veux parler de

00:00:50.205 --> 00:00:52.355
l'un d'eux est la gestion de la mémoire.

00:00:52.355 --> 00:00:53.780
Je t'ai eu. Oui. C'est très important

00:00:53.780 --> 00:00:55.730
parce que nous parlons souvent
à propos de tous les cool,

00:00:55.730 --> 00:00:57.155
caractéristiques de fantaisie que vous pouvez faire,

00:00:57.155 --> 00:01:00.440
mais nous voulions avoir cette
série de pratiques exemplaires

00:01:00.440 --> 00:01:02.340
parce que vous rencontrez des ennuis.

00:01:02.340 --> 00:01:03.820
C'est ce qui arrive. C'est si facile à faire.

00:01:03.820 --> 00:01:06.345
Gestion de la mémoire,
Honnêtement, je suis un noob.

00:01:06.345 --> 00:01:07.770
Je ne sais vraiment pas. Je suis juste comme,

00:01:07.770 --> 00:01:09.560
"Ils vont tuer
mon application en cinq secondes.

00:01:09.560 --> 00:01:11.705
Il n'a pas d'importance, non? Mais
Je ne devrais pas penser comme ça.

00:01:11.705 --> 00:01:14.210
C'est vrai. C'est ce que nous voyons

00:01:14.210 --> 00:01:16.850
parce que personne ne se soucie
la gestion de la mémoire.

00:01:16.850 --> 00:01:21.300
Nous avons tellement de mémoire
et vous ne les vérifiez jamais.

00:01:21.300 --> 00:01:24.750
Je veux dire, quand était la dernière fois que vous
vérifié l'utilisation de la mémoire de votre application?

00:01:24.750 --> 00:01:26.250
La dernière fois que j'ai eu un accident.

00:01:26.250 --> 00:01:29.510
En fait, j'ai eu un très
bon exemple de cela.

00:01:29.510 --> 00:01:31.910
Je vais te dire ça. Ce
est un exemple concret.

00:01:31.910 --> 00:01:35.120
J'ai un bug dans Xamarin Essentials

00:01:35.120 --> 00:01:38.375
qui dit quand j'appelle
cette méthode 20 000 fois,

00:01:38.375 --> 00:01:41.570
mon application se bloque et il
parce que je n'étais pas

00:01:41.570 --> 00:01:45.155
disposer correctement d'un
objet Android natif,

00:01:45.155 --> 00:01:46.775
une fenêtre, un affichage.

00:01:46.775 --> 00:01:48.170
Donc ce qui se passe, c'est,

00:01:48.170 --> 00:01:50.480
Je continuerais à le créer
et il n'obtiendrait jamais

00:01:50.480 --> 00:01:53.135
ordures collectées jamais parce que
Je ne m'en suis jamais débarrassé.

00:01:53.135 --> 00:01:54.890
C'est ce que nous allons
parler d'aujourd'hui.

00:01:54.890 --> 00:01:56.925
Oui, c'est vrai. Génial. Faisons-le
Il. Qu'est-ce que tu as pour nous ?

00:01:56.925 --> 00:02:00.435
Nous avons donc ce petit
application simple avec deux fenêtres,

00:02:00.435 --> 00:02:02.745
écran principal et écran de détail.

00:02:02.745 --> 00:02:06.375
C'est un modèle très courant
Contrôleur de navigation d'interface uI.

00:02:06.375 --> 00:02:09.600
C'est un Xamarin ordinaire
application iOS, non?

00:02:09.600 --> 00:02:10.305
D'accord.

00:02:10.305 --> 00:02:12.440
Ce que nous allons
à faire est d'introduire

00:02:12.440 --> 00:02:14.930
fuites de mémoire dans de nombreux,
de nombreuses façons différentes.

00:02:14.930 --> 00:02:19.025
Mais d'abord, je veux parler de
les différences par rapport au monde autochtone

00:02:19.025 --> 00:02:23.960
et géré le monde
performance et la mémoire.

00:02:23.960 --> 00:02:25.340
Donc, chaque fois que vous avez un processus,

00:02:25.340 --> 00:02:27.995
système d'exploitation donnant
vous un morceau de mémoire.

00:02:27.995 --> 00:02:31.370
Vous devez être conscient à ce sujet
parce qu'une fois que vous êtes à court de mémoire,

00:02:31.370 --> 00:02:33.670
votre application se bloque ou
système d'exploitation le tue.

00:02:33.670 --> 00:02:35.355
Dans la mémoire gérée,

00:02:35.355 --> 00:02:40.260
notre Xamarin Mono obtenir ces
petit morceau de cette mémoire.

00:02:40.260 --> 00:02:41.630
C'est là que nous devrions être

00:02:41.630 --> 00:02:43.670
prudent sur la façon dont nous
utiliser cette pièce ainsi.

00:02:43.670 --> 00:02:44.030
D'accord.

00:02:44.030 --> 00:02:46.640
Donc, vous devriez toujours être
conscients de la mémoire autochtone,

00:02:46.640 --> 00:02:48.905
et maintenant une fois que vous travaillez avec Xamarin,

00:02:48.905 --> 00:02:50.320
également au courant de la partie de gestion.

00:02:50.320 --> 00:02:52.740
Je l'ai. Donc, vous avez
mémoire indigène, iOS,

00:02:52.740 --> 00:02:55.980
Morceaux Android,
Mémoire gérée .NET ?

00:02:55.980 --> 00:02:56.640
C'est vrai.

00:02:56.640 --> 00:02:57.090
Parfait.

00:02:57.090 --> 00:03:00.530
Chaque fois que vous créez un objet
et vous créez, disons,

00:03:00.530 --> 00:03:02.330
un bouton d'interface uI, vous créez réellement

00:03:02.330 --> 00:03:04.950
un bouton d'interface uI natif et
géré la classe de bouton d'interface uI.

00:03:04.950 --> 00:03:06.680
Ils ont un impact de mémoire différent.

00:03:06.680 --> 00:03:10.310
Ils pourraient causer des
problèmes de mémoire parce qu'il ya

00:03:10.310 --> 00:03:14.135
aussi une façon native de recueillir
ordures et de manière gérée.

00:03:14.135 --> 00:03:20.385
Dans Mono, nous utilisons Mono single
collecteur d'ordures de génération.

00:03:20.385 --> 00:03:23.460
Dans le monde natif, iOS utilise ARC,

00:03:23.460 --> 00:03:26.680
Android utilise son propre
éboueur,

00:03:26.680 --> 00:03:29.420
mais ils devraient travailler ensemble
côte à côte et nous devrions

00:03:29.420 --> 00:03:32.300
les avoir parce que vous pouvez
d'introduire des problèmes en utilisant cela.

00:03:32.300 --> 00:03:32.690
Je l'ai.

00:03:32.690 --> 00:03:34.640
Donc, le premier et

00:03:34.640 --> 00:03:36.950
l'approche la plus simple pour introduire

00:03:36.950 --> 00:03:40.830
un problème de mémoire est un abonnement
sans désabonnement.

00:03:42.040 --> 00:03:45.680
Le collecteur d'ordures doit savoir
quand il y a une poubelle.

00:03:45.680 --> 00:03:47.180
Mais comment pouvait-il le savoir ?

00:03:47.180 --> 00:03:49.565
Il devrait être en mesure de construire

00:03:49.565 --> 00:03:53.915
un graphique d'arbre d'accessibilité
et ça part des routes.

00:03:53.915 --> 00:03:57.320
Nos événements statiques, nos variables statiques,

00:03:57.320 --> 00:03:59.350
événements statiques ou appels de thread roll,

00:03:59.350 --> 00:04:01.910
ils sont tous des itinéraires accessibles et

00:04:01.910 --> 00:04:05.005
traite les éboueurs
eux comme pas des ordures.

00:04:05.005 --> 00:04:06.810
Donc, chaque fois que vous vous abonnez comme ça,

00:04:06.810 --> 00:04:09.560
prenons plugin connectivité.

00:04:09.560 --> 00:04:11.960
Je sais, James, tu es
familier avec ce plugin.

00:04:11.960 --> 00:04:13.400
Je le suis. Oui. C'est tout à fait le cas.

00:04:13.400 --> 00:04:14.960
J'aime ça. Dans
ici, nous sommes juste quoi?

00:04:14.960 --> 00:04:16.220
S'abonner à un événement,

00:04:16.220 --> 00:04:18.610
et il pourrait être n'importe quel
événements tels que l'événement de clic,

00:04:18.610 --> 00:04:20.360
vous avez un événement de changement de capteur.

00:04:20.360 --> 00:04:22.715
Fondamentalement, tout ce qui est jamais en .NET.

00:04:22.715 --> 00:04:25.970
Oui, c'est vrai. C'est spécifique
pas seulement à Xamarin.

00:04:25.970 --> 00:04:27.830
C'est n'importe quel événement statique

00:04:27.830 --> 00:04:31.745
dans .NET et connectivité
voici juste un exemple.

00:04:31.745 --> 00:04:35.390
Ce que j'essaie de dire, c'est
pourrait être un événement statique ou

00:04:35.390 --> 00:04:38.960
tout événement fourni par singleton.

00:04:38.960 --> 00:04:40.880
Donc, chaque fois que nous souscrivons comme ça,

00:04:40.880 --> 00:04:42.520
et disons que nous avons

00:04:42.520 --> 00:04:47.100
ce petit morceau de
ConnectivityGestionnaire modifié.

00:04:47.100 --> 00:04:49.655
Nous introduisons une petite fuite de mémoire.

00:04:49.655 --> 00:04:54.290
Il est petit parce que notre point de vue est
assez simple et léger,

00:04:54.290 --> 00:04:55.400
mais c'est une fuite de mémoire.

00:04:55.400 --> 00:04:57.685
C'est donc une fuite de mémoire, pourquoi ?

00:04:57.685 --> 00:05:00.860
Parce que cette connectivité et

00:05:00.860 --> 00:05:03.830
Événement ConnectivityChanged
est une référence statique

00:05:03.830 --> 00:05:05.270
pour notre éboueur.

00:05:05.270 --> 00:05:06.980
Une fois nos ordures
collectionneur essaie de

00:05:06.980 --> 00:05:08.810
déterminer s'il s'agit d'une poubelle ou non,

00:05:08.810 --> 00:05:11.015
ce n'est pas parce que

00:05:11.015 --> 00:05:14.540
ConnectivityL'événement a
une référence à ce gestionnaire,

00:05:14.540 --> 00:05:17.375
et ce gestionnaire gère en fait

00:05:17.375 --> 00:05:21.080
la référence à notre
DétailsViewController.

00:05:21.080 --> 00:05:24.680
Je vois. Je l'ai. Nous avons donc
créé cet événement à l'intérieur de

00:05:24.680 --> 00:05:29.600
ce ViewController et j'ai
souscrits mais jamais désabonnés.

00:05:29.600 --> 00:05:31.970
Donc, il a toujours cette
référence immédiatement.

00:05:31.970 --> 00:05:34.940
Ainsi, les éboueurs disent,
"Hé, qu'est-ce qui est disponible?"

00:05:34.940 --> 00:05:37.030
"Tu ne peux pas avoir ça."

00:05:37.030 --> 00:05:38.205
C'est exact.

00:05:38.205 --> 00:05:40.580
Je veux m'assurer que
c'est exact parce que je

00:05:40.580 --> 00:05:42.185
croire que c'est ainsi que
cela fonctionne dans mon esprit.

00:05:42.185 --> 00:05:43.150
Je veux m'assurer que j'ai raison.

00:05:43.150 --> 00:05:47.225
Le collecteur d'ordures à tâche unique
ne est de désaffecter la mémoire,

00:05:47.225 --> 00:05:48.605
et de le faire correctement,

00:05:48.605 --> 00:05:50.540
collecteur d'ordures doivent savoir comment

00:05:50.540 --> 00:05:52.730
identifier correctement si
c'est des ordures ou pas.

00:05:52.730 --> 00:05:53.180
Je l'ai.

00:05:53.180 --> 00:05:55.790
Donc, pour construire un arbre d'accessibilité,

00:05:55.790 --> 00:05:59.270
un éboueur
utilise des itinéraires statiques ou

00:05:59.270 --> 00:06:01.430
juste des itinéraires et des événements statiques

00:06:01.430 --> 00:06:03.500
ou toute propriété statique
comme l'un de la route.

00:06:03.500 --> 00:06:06.460
Aussi les variables locales,
beaucoup d'autres choses.

00:06:06.460 --> 00:06:07.020
Je l'ai.

00:06:07.020 --> 00:06:11.820
Alors laissez-moi l'exécuter
et montrer comment cela fonctionne.

00:06:11.820 --> 00:06:14.745
Pensez-vous que nous allons
voir une différence?

00:06:14.745 --> 00:06:17.540
Je ne sais pas. Je veux dire
j'espère que non parce que

00:06:17.540 --> 00:06:20.090
c'est si simple, c'est ce que je pense.

00:06:20.090 --> 00:06:22.160
Maintenant, ma crainte est que

00:06:22.160 --> 00:06:24.200
puisque nous nous inscrivons plus
et encore et encore,

00:06:24.200 --> 00:06:26.750
si nous changeons les événements,

00:06:26.750 --> 00:06:28.850
nous obtenons probablement
dans beaucoup d'événements.

00:06:28.850 --> 00:06:30.635
Oui, c'est vrai. Vérifions-le.

00:06:30.635 --> 00:06:33.560
J'ai donc déménagé à la page Détails.

00:06:33.560 --> 00:06:36.185
Je vais débrancher mon Wi-Fi maintenant.

00:06:36.185 --> 00:06:38.510
Ici, nous utilisons
simulateur iOS.

00:06:38.510 --> 00:06:41.975
Donc, c'est en fait en utilisant
internet de la machine.

00:06:41.975 --> 00:06:46.460
Oui, c'est vrai. On vient d'avoir un étui ici.
qui sont ConnectivityChanged.

00:06:46.460 --> 00:06:51.910
Revenons en arrière quelques fois
et quelques fois de plus,

00:06:51.910 --> 00:06:54.630
et je suis de retour sur la page principale.

00:06:54.630 --> 00:06:58.215
Je ne suis pas délicat dans
rien en ce moment,

00:06:58.215 --> 00:07:01.280
et je suppose que mes détails
page ne sont plus là, non?

00:07:01.280 --> 00:07:01.430
Oui, c'est vrai.

00:07:01.430 --> 00:07:02.810
Mon gestionnaire d'abonnement

00:07:02.810 --> 00:07:04.805
ne devrait pas fonctionner parce que
J'ai rien fait.

00:07:04.805 --> 00:07:07.015
Passons au Wi-Fi.

00:07:07.015 --> 00:07:09.510
D'accord. Donc, nous avons créé en fait

00:07:09.510 --> 00:07:11.910
cette connectivitéChanged
sur la deuxième page.

00:07:11.910 --> 00:07:12.420
Deuxième page.

00:07:12.420 --> 00:07:13.665
Eh bien, je suis sur la première page.

00:07:13.665 --> 00:07:17.440
Oui, c'est vrai. Nous ne nous attendons donc pas à
notre gestionnaire au travail,

00:07:17.440 --> 00:07:18.645
mais regardez ce que nous avons.

00:07:18.645 --> 00:07:21.090
On vient d'avoir quatre maîtres
exécution de notre code,

00:07:21.090 --> 00:07:23.600
et il pourrait être n'importe quel
base de données de mise à jour du code,

00:07:23.600 --> 00:07:25.505
sauvegarder les paramètres, peu importe.

00:07:25.505 --> 00:07:28.070
La question ici non seulement
avec la gestion de la mémoire

00:07:28.070 --> 00:07:30.635
parce qu'il faut un peu de mémoire.

00:07:30.635 --> 00:07:34.970
C'est aussi un problème parce que nous avons
certains codes à exécuter ainsi.

00:07:34.970 --> 00:07:37.445
Alors cela signifie-t-il
que la page Détails,

00:07:37.445 --> 00:07:39.350
maintenant, il ne peut jamais être
ordures collectées?

00:07:39.350 --> 00:07:42.455
Alors maintenant, j'ai juste cette
Détails page toujours en mémoire.

00:07:42.455 --> 00:07:43.400
Malheureusement, oui.

00:07:43.400 --> 00:07:44.660
Oh mon Dieu, c'est mauvais.

00:07:44.660 --> 00:07:47.385
C'est mauvais. En tant que développeur,

00:07:47.385 --> 00:07:49.560
nous ne voyons pas toujours cela.

00:07:49.560 --> 00:07:54.280
En tant qu'utilisateur, je vois mon application se bloque
Comme une fois par semaine, peu importe.

00:07:54.280 --> 00:07:56.675
Je vais le redémarrer.
et continuer à l'utiliser.

00:07:56.675 --> 00:07:58.220
C'est pour ça qu'il n'est pas signalé,

00:07:58.220 --> 00:08:00.350
ce n'est pas pris très au sérieux,

00:08:00.350 --> 00:08:03.950
mais c'est un problème surtout si vous

00:08:03.950 --> 00:08:08.330
obtenir une image énorme là-bas
qui affecte votre mémoire.

00:08:08.330 --> 00:08:10.910
Donc, je vais décommenter
cette ligne de code,

00:08:10.910 --> 00:08:14.680
qui ajoute en fait une charge de mémoire

00:08:14.680 --> 00:08:19.740
ici et il charge un
image d'Internet.

00:08:19.740 --> 00:08:22.265
On prend juste une image au hasard.

00:08:22.265 --> 00:08:24.815
Permettez-moi de montrer que c'est vraiment aléatoire.

00:08:24.815 --> 00:08:27.035
Voyons ce qu'on a ici.

00:08:27.035 --> 00:08:29.510
Je suis toujours inquiet à ce sujet.

00:08:29.510 --> 00:08:32.210
d'accord. Donc, nous avons cette image aléatoire,

00:08:32.210 --> 00:08:34.370
et c'est ce que nous sommes
va charger dans

00:08:34.370 --> 00:08:37.190
notre application chaque fois que nous
entrez dans la page Détails.

00:08:37.190 --> 00:08:37.610
D'accord.

00:08:37.610 --> 00:08:40.395
Laissez-moi le montrer ici.

00:08:40.395 --> 00:08:42.970
C'est tout à fait quelque chose
que ce qui arrive toujours, non?

00:08:42.970 --> 00:08:45.220
Parce que aller à une page Détails,

00:08:45.220 --> 00:08:46.740
probablement charger des informations,

00:08:46.740 --> 00:08:48.080
pourrait tirer certains
l'information de

00:08:48.080 --> 00:08:51.095
une base de données sur cet écran,
et ça pourrait être mauvais.

00:08:51.095 --> 00:08:53.930
Imaginez-vous que vous êtes
en utilisant l'application Instagram.

00:08:53.930 --> 00:08:55.330
Vous avez une page Détails là-bas.

00:08:55.330 --> 00:08:56.710
Vous tapez et suivez,

00:08:56.710 --> 00:08:58.435
entrer dans les détails, retour en arrière.

00:08:58.435 --> 00:09:00.720
Allez vérifier un autre dossier,
entrer dans les détails,

00:09:00.720 --> 00:09:03.920
retourné, et dans une semaine votre application
s'écrase et personne ne sait pourquoi.

00:09:03.920 --> 00:09:06.680
C'est alors que les problèmes de mémoire
pourrait entrer en jeu.

00:09:06.680 --> 00:09:09.180
Je t'ai eu.

00:09:09.180 --> 00:09:11.855
Je ne vais pas vous montrer que
fuite de mémoire est toujours là

00:09:11.855 --> 00:09:14.650
parce que je veux montrer
vous le profiler,

00:09:14.650 --> 00:09:16.375
comment vous pouvez identifier ces problèmes.

00:09:16.375 --> 00:09:17.800
Pour identifier ces problèmes,

00:09:17.800 --> 00:09:19.990
vous avez quelques outils.

00:09:19.990 --> 00:09:23.350
Tout d'abord, ce sont des outils indigènes,
iOs fournit des instruments,

00:09:23.350 --> 00:09:25.520
et le deuxième est l'outil géré,

00:09:25.520 --> 00:09:27.005
qui est Xamarin Profiler.

00:09:27.005 --> 00:09:27.990
Je t'ai eu.

00:09:27.990 --> 00:09:29.520
Pourquoi pensez-vous que nous avons besoin des deux?

00:09:29.520 --> 00:09:32.985
Eh bien, ils font des choses différentes.

00:09:32.985 --> 00:09:36.090
Oui, c'est vrai. En fait,
à cause de cette image.

00:09:36.090 --> 00:09:38.025
Rappelez-vous. J'en parlais.

00:09:38.025 --> 00:09:41.565
En fait, ils peuvent savoir
sur sa propre partie.

00:09:41.565 --> 00:09:44.190
Donc Xamarin Profiler ne sait rien

00:09:44.190 --> 00:09:47.100
sur le natif de la mémoire
objets créés là-bas,

00:09:47.100 --> 00:09:50.010
et les instruments indigènes ne
connaître la mémoire gérée.

00:09:50.010 --> 00:09:52.685
Il dit juste qu'il ya quelques
morceau d'objet créé.

00:09:52.685 --> 00:09:54.710
Quand Mono crée un objet,

00:09:54.710 --> 00:09:57.275
il encore le lier en quelque sorte
aux objets indigènes.

00:09:57.275 --> 00:09:59.210
Donc ceux que vous pourrez voir,

00:09:59.210 --> 00:10:00.500
mais tout le reste ne le sera pas.

00:10:00.500 --> 00:10:01.220
D'accord. Cool.

00:10:01.220 --> 00:10:02.945
Alors voyons le profileur Xamarin.

00:10:02.945 --> 00:10:06.550
Il est plus facile de comprendre
au début,

00:10:06.550 --> 00:10:10.955
et il vous montre aussi agréable
namespace et comme le nom.

00:10:10.955 --> 00:10:12.815
Ainsi, vous pouvez identifier votre objet.

00:10:12.815 --> 00:10:16.715
Il y a un petit bouton "Run"
et "Start Profile" ici.

00:10:16.715 --> 00:10:20.050
Vous avez besoin d'une entreprise
permis de le faire.

00:10:20.050 --> 00:10:23.870
Mais c'est très pratique et
Je vous encourage à le faire.

00:10:23.870 --> 00:10:25.190
Donc une fois que vous faites cela,

00:10:25.190 --> 00:10:26.825
il construit réellement l'application avec

00:10:26.825 --> 00:10:31.130
quelques métadonnées supplémentaires et
code intégré dans votre application.

00:10:31.130 --> 00:10:33.580
Ainsi, nous avons pu voir et
suivre les objets.

00:10:33.580 --> 00:10:36.140
Maintenant, une chose alors que cette
est la construction et le déploiement est,

00:10:36.140 --> 00:10:38.030
nous courons sur un
simulateur qui signifie qu'il

00:10:38.030 --> 00:10:40.520
a toute la puissance de cette.

00:10:40.520 --> 00:10:45.320
Est-ce que c'est bien que je le fasse
et le profilage sur mon appareil,

00:10:45.320 --> 00:10:49.150
ou est-il préférable de le faire sur un
physique iPhone, par exemple?

00:10:49.150 --> 00:10:50.570
C'est une bonne question parce que vous

00:10:50.570 --> 00:10:52.340
peut faire différents types de profilage.

00:10:52.340 --> 00:10:52.940
Intéressant.

00:10:52.940 --> 00:10:54.230
Si vous faites le profil age cPU,

00:10:54.230 --> 00:10:56.480
ce n'est pas une bonne idée
pour le faire sur simulateur

00:10:56.480 --> 00:10:58.820
parce que vous n'avez pas le
pleine puissance de l'appareil.

00:10:58.820 --> 00:11:01.340
Mais si vous faites un souvenir
profileur et allocation,

00:11:01.340 --> 00:11:04.355
vous obtiendrez les mêmes problèmes
sur simulateur et sur appareil.

00:11:04.355 --> 00:11:04.730
Parfait.

00:11:04.730 --> 00:11:10.300
J'aime le faire sur l'ordinateur portable
parce qu'il commence juste plus vite.

00:11:10.300 --> 00:11:13.010
Il ne traduit pas le code

00:11:13.010 --> 00:11:16.085
dans les instructions indigènes et juste
simule et s'exécute instantanément.

00:11:16.085 --> 00:11:18.470
Donc, chaque fois que vous faites le profilage de la mémoire,

00:11:18.470 --> 00:11:20.180
si vous exécutez des applications tant de fois,

00:11:20.180 --> 00:11:23.045
donc tu vas aimer ça.

00:11:23.045 --> 00:11:25.085
Permettez-moi de faire le même test.

00:11:25.085 --> 00:11:27.980
J'ai donc ouvert la page Détails une fois,

00:11:27.980 --> 00:11:29.840
et vous voyez ce petit pic ici.

00:11:29.840 --> 00:11:33.590
Cela signifie que nous avons augmenté notre
l'utilisation de la mémoire de manière significative.

00:11:33.590 --> 00:11:35.915
Mais vous ne voyez pas cela
augmentation de la mémoire ici.

00:11:35.915 --> 00:11:38.510
C'est toujours comme si le plus gros objet était

00:11:38.510 --> 00:11:40.730
systèmes arbre et quelque part ici.

00:11:40.730 --> 00:11:43.155
Permettez-moi de le faire quelques fois de plus.

00:11:43.155 --> 00:11:45.815
Je vais l'augmenter à nouveau.

00:11:45.815 --> 00:11:47.610
Vous verrez le pic ici,

00:11:47.610 --> 00:11:49.735
mais vous ne voyez pas de pointes ici.

00:11:49.735 --> 00:11:53.330
Ce qui signifie que lorsque nous allouons
dans quelque chose dans la mémoire indigène,

00:11:53.330 --> 00:11:56.220
il ne reflète pas
dans le monde géré,

00:11:56.220 --> 00:11:59.419
mais nous voyons la mémoire totale est
de plus en plus et non pas de deallocating,

00:11:59.419 --> 00:12:00.720
qui est la chose la plus importante.

00:12:00.720 --> 00:12:01.455
Je vois.

00:12:01.455 --> 00:12:04.015
Nous revenons avec cet instantané.

00:12:04.015 --> 00:12:05.710
L'instantané de mémoire s'exécute réellement

00:12:05.710 --> 00:12:07.875
la collecte des ordures
sur le site géré.

00:12:07.875 --> 00:12:10.195
Donc, nous faisons cet instantané.
J'en ferai un autre.

00:12:10.195 --> 00:12:11.755
Je l'expliquerai plus tard,

00:12:11.755 --> 00:12:14.500
pour faire face à l'indice de finalisation.

00:12:14.500 --> 00:12:17.475
Mais en gros, maintenant c'est de la mémoire propre.

00:12:17.475 --> 00:12:19.605
Nous nous assurerons que
notre éboueur

00:12:19.605 --> 00:12:22.270
déjà couru et deallocated
tout l'objet acquis.

00:12:22.270 --> 00:12:23.920
Nous voyons encore les souvenirs là-bas.

00:12:23.920 --> 00:12:25.845
Donc, il est encore tombé.

00:12:25.845 --> 00:12:28.755
Pour savoir ce qui se passe ici,

00:12:28.755 --> 00:12:32.005
nous venons d'aller ici et
utiliser le bouton de filtre.

00:12:32.005 --> 00:12:35.265
Nous essayons d'identifier
seuls les objets R,

00:12:35.265 --> 00:12:38.110
et je veux aussi voir sur
les objets vivants ici.

00:12:38.110 --> 00:12:40.980
Alors j'ai frappé ce "Apply"
bouton, et voilà,

00:12:40.980 --> 00:12:43.575
nous voyons deux détails contrôleur
suspendus dans la mémoire,

00:12:43.575 --> 00:12:47.160
même si je n'ai pas
ont des détails en place.

00:12:47.160 --> 00:12:48.570
Super échantillon, donc vous avez dit,

00:12:48.570 --> 00:12:50.289
trouver tout dans mon nom-espace,

00:12:50.289 --> 00:12:51.610
filtrer à ce sujet.

00:12:51.610 --> 00:12:54.820
Littéralement ce que nous voyons ici
est Détail View Controller 2.

00:12:54.820 --> 00:12:55.225
Oui, c'est vrai.

00:12:55.225 --> 00:12:56.650
Mais il devrait être parti.

00:12:56.650 --> 00:13:00.015
Je vais commencer par le plus grand
objets que vous avez dans ces pages.

00:13:00.015 --> 00:13:00.280
Oui, c'est vrai.

00:13:00.280 --> 00:13:02.865
C'est vrai pour Android aussi.

00:13:02.865 --> 00:13:04.030
Vous cherchez juste des activités,

00:13:04.030 --> 00:13:05.395
voir les modèles, ou quoi que ce soit,

00:13:05.395 --> 00:13:07.875
parce qu'une fois que vous avez une vue
modèle suspendu là-dedans,

00:13:07.875 --> 00:13:11.320
il commence à lier tous les
les autres objets.

00:13:11.320 --> 00:13:13.380
Tous les services, toutes les liaisons,

00:13:13.380 --> 00:13:16.605
toutes les interfaces de l'interface, et vous
obtenir beaucoup de mémoire.

00:13:16.605 --> 00:13:17.500
Je l'ai.

00:13:17.500 --> 00:13:19.465
Permettez-moi de montrer que c'est vrai.

00:13:19.465 --> 00:13:23.260
Je vais l'ouvrir un de plus
temps, appuyez sur le "Snapshot".

00:13:23.260 --> 00:13:25.455
Nous voyons trois cas ici.

00:13:25.455 --> 00:13:28.569
Je vais revenir, frapper "Snapshot",

00:13:28.569 --> 00:13:30.030
et il reste dans la mémoire.

00:13:30.030 --> 00:13:30.660
Je t'ai eu.

00:13:30.660 --> 00:13:32.500
Donc, nous allons résoudre ce problème de mémoire.

00:13:32.500 --> 00:13:33.700
Je suis prêt.

00:13:33.700 --> 00:13:36.470
Comment répareriez-vous cela?

00:13:41.220 --> 00:13:43.525
Il s'agit d'une page de détails,

00:13:43.525 --> 00:13:45.460
donc nous devons nous désabonner
lors d'un événement.

00:13:45.460 --> 00:13:49.325
Je t'ai eu. Donc, le vrai problème ici
c'est que je me suis abonné à un événement.

00:13:49.325 --> 00:13:49.970
Oui, c'est vrai.

00:13:49.970 --> 00:13:52.135
Alors on devrait se désabonner, non ?

00:13:52.135 --> 00:13:54.550
C'est exact. Ce
est une bonne pratique.

00:13:54.550 --> 00:13:56.370
Chaque fois que vous voyez ce plus égal,

00:13:56.370 --> 00:13:59.490
vous venez de chercher si
il y a un moins égal,

00:13:59.490 --> 00:14:01.980
si ce n'est pas le cas, vous
devrait introduire cela.

00:14:01.980 --> 00:14:02.595
Je l'ai.

00:14:02.595 --> 00:14:05.020
C'est la première indication
que vous avez une fuite de mémoire.

00:14:05.020 --> 00:14:05.340
Je l'ai.

00:14:05.340 --> 00:14:10.460
La seule exception est quand
vous vous abonnez sur la page principale,

00:14:10.460 --> 00:14:12.285
comme notre page principale ici,

00:14:12.285 --> 00:14:14.725
et vous êtes sûr que cette page

00:14:14.725 --> 00:14:18.010
ne sera pas en mesure d'aller
loin de sitôt.

00:14:18.010 --> 00:14:20.115
Peut-être que vous l'avez à
vos niveaux De délégué s'il s'est vu.

00:14:20.115 --> 00:14:21.530
Tu es comme, j'ai fait en fait
veulent que ce soit

00:14:21.530 --> 00:14:23.290
un événement mondial pour tous les temps.

00:14:23.290 --> 00:14:25.845
Mais aussi peut-être quand votre application
va dans l'arrière-plan,

00:14:25.845 --> 00:14:27.295
vous devriez également vous désabonner.

00:14:27.295 --> 00:14:28.345
C'est vrai.

00:14:28.345 --> 00:14:28.675
Oui, c'est vrai.

00:14:28.675 --> 00:14:29.700
Pas à exécuter.

00:14:29.700 --> 00:14:31.750
Alors maintenant tu dis
quand il apparaît,

00:14:31.750 --> 00:14:33.855
il s'abonnera, et disparaîtra,

00:14:33.855 --> 00:14:35.935
désabonner, et puis vous
enlever celui en haut.

00:14:35.935 --> 00:14:37.990
Oui, j'ai retiré du Nuage,

00:14:37.990 --> 00:14:39.710
parce que nous voulons
l'exécuter chaque fois que nous

00:14:39.710 --> 00:14:42.040
apparaissent et chaque fois que nous disparaissons.

00:14:42.040 --> 00:14:43.850
Plus égale à s'abonner,

00:14:43.850 --> 00:14:45.640
moins égale à se désabonner.

00:14:45.640 --> 00:14:48.735
Rien de compliqué, je veux juste

00:14:48.735 --> 00:14:52.045
assurez-vous que nous n'avons pas besoin de tout
instruments une fois que vous passez par elle.

00:14:52.045 --> 00:14:52.720
Cool.

00:14:52.720 --> 00:14:55.110
Donc je fais la même chose,

00:14:55.110 --> 00:14:59.490
va aux détails,
montrant que c'est vrai.

00:14:59.490 --> 00:15:02.980
Prendre un instantané,
filtrer dans mes événements.

00:15:02.980 --> 00:15:05.300
Pardon. Il vient de cliquer.

00:15:08.700 --> 00:15:12.170
Voyons voir sur les objets en direct.

00:15:12.420 --> 00:15:15.345
Nous devrions voir les détails
parce que nous sommes actuellement sur

00:15:15.345 --> 00:15:17.475
détail. On y retourne.

00:15:17.475 --> 00:15:18.990
Nous avons frappé un "Snapshot"

00:15:18.990 --> 00:15:20.880
et qu'attendons-nous ici?

00:15:20.880 --> 00:15:23.715
Tout d'abord, la collecte des ordures en fait

00:15:23.715 --> 00:15:26.065
mettre ces objets dans
repère de finalisation,

00:15:26.065 --> 00:15:27.625
mais deuxième devrait repère 1,

00:15:27.625 --> 00:15:30.340
ou probablement toujours le même.

00:15:30.340 --> 00:15:31.570
Maintenant, il a disparu.

00:15:31.570 --> 00:15:33.910
Oui, c'est vrai. Alors laissez-moi vous parler

00:15:33.910 --> 00:15:36.940
finalisation dans un
deuxièmement, mais pour l'instant,

00:15:36.940 --> 00:15:40.395
l'idée est que nous avons
perdu notre vue détails,

00:15:40.395 --> 00:15:43.135
et notre utilisation de la mémoire à venir vers le bas.

00:15:43.135 --> 00:15:43.770
Magnifique.

00:15:43.770 --> 00:15:46.150
C'est ainsi que nous réparons les fuites de mémoire.

00:15:46.150 --> 00:15:49.420
Oui, c'est vrai. Vous avez souscrit à votre
Événements. Désabonner des événements.

00:15:49.420 --> 00:15:51.630
Règle de base.

00:15:51.630 --> 00:15:54.915
C'est vraiment drôle aussi
parce que l'un, il cause deux problèmes.

00:15:54.915 --> 00:15:56.800
On a vu que tu le gardais en vie.

00:15:56.800 --> 00:15:58.750
parce que ces événements continuent.

00:15:58.750 --> 00:16:00.715
Alors maintenant tu tires
plusieurs fois,

00:16:00.715 --> 00:16:04.290
mais aussi, tout sur cette page
va être laissé dans la mémoire.

00:16:04.290 --> 00:16:06.685
C'est vrai. C'est pourquoi
nous avons ajouté une image lourde,

00:16:06.685 --> 00:16:08.205
et c'est encore dans la mémoire.

00:16:08.205 --> 00:16:08.830
Je l'ai.

00:16:08.830 --> 00:16:10.570
Laissez-moi vous montrer Instruments.

00:16:10.570 --> 00:16:13.390
Donc, je vais vous présenter
retour de notre fuite de mémoire.

00:16:13.390 --> 00:16:13.800
Bien sûr.

00:16:13.800 --> 00:16:15.985
Il suffit de supprimer l'événement non abonné.

00:16:15.985 --> 00:16:18.435
Je vais me déployer sur mon simulateur,

00:16:18.435 --> 00:16:21.330
et les instruments fonctionne assez facile.

00:16:21.330 --> 00:16:23.355
Il vous suffit de choisir la cible de

00:16:23.355 --> 00:16:25.930
le simulateur et le
app, et c'est tout.

00:16:25.930 --> 00:16:28.435
C'est tout ce dont vous avez besoin pour commencer
le profileur Instruments.

00:16:28.435 --> 00:16:30.175
Même si c'est l'application Xamarin,

00:16:30.175 --> 00:16:32.150
vous pouvez le démarrer à droite
des Instruments,

00:16:32.150 --> 00:16:33.615
qui ne sait rien de Xamarin.

00:16:33.615 --> 00:16:35.310
D'où viennent les instruments?

00:16:35.310 --> 00:16:38.709
Apple. C'est une Pomme
outil, est livré avec Xcode,

00:16:38.709 --> 00:16:41.950
et il a beaucoup de
l'outillage à l'intérieur de celui-ci.

00:16:41.950 --> 00:16:43.450
Donc, il est juste construit en
parce que vous avez déjà

00:16:43.450 --> 00:16:45.415
Xcode installé? ainsi
tout le monde a ça ?

00:16:45.415 --> 00:16:46.015
C'est gratuit.

00:16:46.015 --> 00:16:48.925
C'est gratuit. Cool. Donc, tout le monde
peut utiliser ce dès maintenant?

00:16:48.925 --> 00:16:53.880
Oui, c'est vrai. Vous pouvez réellement
voir ces activités,

00:16:53.880 --> 00:16:57.920
même si ceux créés par des
monde comme l'activité de détails,

00:16:57.920 --> 00:17:00.525
il est toujours représenté
par un objet indigène.

00:17:00.525 --> 00:17:00.930
Je l'ai.

00:17:00.930 --> 00:17:02.855
Alors cherchons cet objet.

00:17:02.855 --> 00:17:07.240
Nous l'appelons Details View Controller.

00:17:07.240 --> 00:17:09.595
Permettez-moi de créer quelques-uns d'entre eux.

00:17:09.595 --> 00:17:11.030
C'est en fait
vraiment cool parce que

00:17:11.030 --> 00:17:12.240
Je n'ai jamais utilisé d'instruments,

00:17:12.240 --> 00:17:15.295
ne le dis à personne, dans des an nées.

00:17:15.295 --> 00:17:18.440
Je ne pense pas que tout le monde donne
moi un détail. Donc, il existe?

00:17:18.440 --> 00:17:20.070
Oui, il existe.

00:17:20.070 --> 00:17:22.335
C'est logique.
parce que Xamarin est natif,

00:17:22.335 --> 00:17:23.770
de sorte qu'il crée un objet natif.

00:17:23.770 --> 00:17:26.380
Oui, c'est vrai. Vous n'avez pas besoin de faire

00:17:26.380 --> 00:17:27.885
un instantané de mémoire ici

00:17:27.885 --> 00:17:29.975
parce que nous n'avons pas
collecte des ordures ici.

00:17:29.975 --> 00:17:33.780
IOS utilise la hiérarchie, qui est
compteur de référence automatique.

00:17:33.780 --> 00:17:35.605
Fondamentalement, chaque fois que
vous créez un objet,

00:17:35.605 --> 00:17:37.065
il incréments le compteur,

00:17:37.065 --> 00:17:39.550
chaque fois que vous n'utilisez pas ou il

00:17:39.550 --> 00:17:42.505
s'éloigne de la portée de
l'utilisation, il décréments le compteur.

00:17:42.505 --> 00:17:43.845
Une fois que le compteur est nul,

00:17:43.845 --> 00:17:46.495
l'objet est des ordures, et
il pourrait être collecté.

00:17:46.495 --> 00:17:48.075
Il est donc assez facile de commencer

00:17:48.075 --> 00:17:51.735
les instruments avec l'application
simplement en cliquant sur ce bouton.

00:17:51.735 --> 00:17:53.505
Il démarre l'application,

00:17:53.505 --> 00:17:55.860
il vous montre l'utilisation de la mémoire ici.

00:17:55.860 --> 00:17:57.690
Ouvrons la page Détails.

00:17:57.690 --> 00:18:00.425
Je t'ai eu. Instruments
vient d'Apple?

00:18:00.425 --> 00:18:02.040
Les instruments proviennent d'Apple.

00:18:02.040 --> 00:18:03.350
C'est un outil gratuit d'Apple.

00:18:03.350 --> 00:18:04.490
Vous pouvez l'utiliser tout de suite.

00:18:04.490 --> 00:18:05.390
Cool.

00:18:05.390 --> 00:18:06.970
Vous voyez que nous avons aussi

00:18:06.970 --> 00:18:10.140
cette empreinte de mémoire droit
ici une fois que nous ouvrons la page Détails.

00:18:10.140 --> 00:18:12.120
Ouvrons-le encore une fois.

00:18:12.120 --> 00:18:15.140
Donc, c'est très similaire
au profileur Xamarin,

00:18:15.140 --> 00:18:16.870
mais cela va nous montrer

00:18:16.870 --> 00:18:19.240
la pile native pour tous
intentions et les buts.

00:18:19.240 --> 00:18:21.500
C'est vrai. Malheureusement, il

00:18:21.500 --> 00:18:24.090
ne sait rien sur
Xamarin et le monde géré,

00:18:24.090 --> 00:18:27.025
de sorte que vous ne serez pas en mesure de voir
l'objet géré qu'il a créé.

00:18:27.025 --> 00:18:28.990
Donc, vous voyez le pic,

00:18:28.990 --> 00:18:30.850
et vous voyez qu'il ne disparaît pas.

00:18:30.850 --> 00:18:33.350
Alors laissez-moi le faire une troisième fois,

00:18:33.350 --> 00:18:35.145
et il suffit de montrer les objets.

00:18:35.145 --> 00:18:38.455
Voyons voir. Il y a
un petit bouton de filtre.

00:18:38.455 --> 00:18:43.170
Nous allons à toutes les allocations ici,

00:18:43.170 --> 00:18:45.165
et appuyez sur les "Détails".

00:18:45.165 --> 00:18:45.820
D'accord.

00:18:45.820 --> 00:18:47.555
C'est trois pages ici,

00:18:47.555 --> 00:18:48.660
ils sont tous dans la mémoire,

00:18:48.660 --> 00:18:50.650
et ils allouent en mémoire.

00:18:50.650 --> 00:18:54.070
Je ne montrerai pas comment nous délitons
parce que c'est le même correctif,

00:18:54.070 --> 00:18:57.020
nous nous désabonner,
monde géré se désabonne

00:18:57.020 --> 00:19:00.120
de l'objet. Objet
considérés comme des ordures.

00:19:00.120 --> 00:19:04.660
Puis notre éboueur
recueille ces informations,

00:19:04.660 --> 00:19:06.460
alors natif peut recueillir
parce que rien

00:19:06.460 --> 00:19:08.490
de gérer le monde
déjà s'en tenir à cela.

00:19:08.490 --> 00:19:10.780
C'est logique. Donc, très
à peu près le même correctif,

00:19:10.780 --> 00:19:12.255
mais une autre façon de le détecter.

00:19:12.255 --> 00:19:15.045
C'est vrai. Donc, c'est

00:19:15.045 --> 00:19:19.345
sur les différences entre les
monde géré et indigène.

00:19:19.345 --> 00:19:22.120
Mes prochains exemples seront
être principalement sur géré

00:19:22.120 --> 00:19:25.320
monde parce que vous pouvez
d'introduire des problèmes dans n'importe quel,

00:19:25.320 --> 00:19:26.905
et ce n'est pas lié à Xamarin.

00:19:26.905 --> 00:19:29.570
Comme vous l'avez dit, il pourrait être
s'abonner à l'événement statique,

00:19:29.570 --> 00:19:32.745
il pourrait introduire
question, même n'importe où.

00:19:32.745 --> 00:19:35.410
Donc, la prochaine chose est

00:19:35.410 --> 00:19:38.210
sur l'abonnement, et
sans désabonnements.

00:19:38.210 --> 00:19:39.315
Mais dans ce cas,

00:19:39.315 --> 00:19:42.820
nous sommes en fait
s'abonner implicitement,

00:19:42.820 --> 00:19:44.480
nous n'utilisons pas plus égaux.

00:19:44.480 --> 00:19:46.015
C'est donc plus difficile à trouver.

00:19:46.015 --> 00:19:48.710
Dans ce cas, nous courons cette
centre de notification en essayant de

00:19:48.710 --> 00:19:51.795
identifier chaque fois que notre application est tournée.

00:19:51.795 --> 00:19:53.695
Nous ajoutons cet observateur.

00:19:53.695 --> 00:19:57.525
Il s'agit d'un centre par défaut singleton.

00:19:57.525 --> 00:19:59.700
Nous disons que, je veux obtenir

00:19:59.700 --> 00:20:02.595
toute information chaque fois que
l'orientation a changé,

00:20:02.595 --> 00:20:04.140
et voici mon gestionnaire pour ça.

00:20:04.140 --> 00:20:04.650
Je l'ai.

00:20:04.650 --> 00:20:06.690
Le gestionnaire lui-même,
c'est assez facile.

00:20:06.690 --> 00:20:08.125
Nous ne ferons rien là-bas,

00:20:08.125 --> 00:20:11.665
On va l'imprimer pour le déboguer.

00:20:11.665 --> 00:20:12.465
Je l'ai.

00:20:12.465 --> 00:20:15.525
Laissez-moi enlever le
trucs de connectivité parce que

00:20:15.525 --> 00:20:18.630
nous voulons introduire différents
types de problème de mémoire.

00:20:18.630 --> 00:20:21.525
Je commente aussi notre
image parce que nous n'avons pas besoin

00:20:21.525 --> 00:20:24.430
pour montrer la mémoire
empreinte de pas, il est là.

00:20:24.430 --> 00:20:28.390
Nous allons expérimenter juste avec
Contrôleurs et vues d'affichage d'interface.

00:20:28.390 --> 00:20:30.650
Très cool. Donc, cette
est très similaire,

00:20:30.650 --> 00:20:32.870
mais ce modèle, vous
pourrait s'abonner,

00:20:32.870 --> 00:20:34.605
peut-être même en passant dans une action.

00:20:34.605 --> 00:20:38.340
Ou dans ce cas, ce qu'il fait
il est dit que voici votre rappel.

00:20:38.340 --> 00:20:40.010
Les délégués sont très similaires,

00:20:40.010 --> 00:20:41.115
Je pense à ce modèle.

00:20:41.115 --> 00:20:42.480
Donc, c'est juste quelque chose
J'ai l'habitude aussi.

00:20:42.480 --> 00:20:45.590
C'est vrai. C'était

00:20:45.590 --> 00:20:47.864
leur idée principale parce que
lorsque vous vous abonnez,

00:20:47.864 --> 00:20:51.405
vous passez la référence à
le contrôleur de vue d'interface uI aussi bien.

00:20:51.405 --> 00:20:53.425
C'est juste un autre
façon de passer la référence.

00:20:53.425 --> 00:20:55.260
Ce n'est pas si évident parfois.

00:20:55.260 --> 00:20:57.955
Donc, nous avons notre abonnement,
il est en cours d'exécution ici.

00:20:57.955 --> 00:20:59.305
Il ne tourne qu'une fois.

00:20:59.305 --> 00:21:01.780
Fermons-le et ouvrons-le à nouveau.

00:21:01.780 --> 00:21:03.525
Maintenant, nous avons un double clic.

00:21:03.525 --> 00:21:05.230
Laissez-moi vous montrer ça.

00:21:05.230 --> 00:21:07.240
Tournant une fois, obtenant deux,

00:21:07.240 --> 00:21:11.655
ce qui signifie que nous avons une certaine vue d'interface uI
Contrôleur suspendu en mémoire,

00:21:11.655 --> 00:21:13.535
tout en continuant à traiter le premier.

00:21:13.535 --> 00:21:13.980
Je l'ai.

00:21:13.980 --> 00:21:15.430
Il pourrait être un problème si vous avez

00:21:15.430 --> 00:21:19.660
une logique de mise à jour de base de données
ou HTTP demande des heures supplémentaires.

00:21:19.660 --> 00:21:21.340
Comme dans un jour d'utilisation,

00:21:21.340 --> 00:21:24.810
votre application n'est pas tuée, vous
désactiver, réactiver.

00:21:24.810 --> 00:21:26.740
Il aura tout cela
Afficher encore en mémoire,

00:21:26.740 --> 00:21:28.265
et dans une semaine, il pourrait s'écraser.

00:21:28.265 --> 00:21:28.785
Oui, c'est vrai.

00:21:28.785 --> 00:21:30.105
Alors, comment arranger ça ?

00:21:30.105 --> 00:21:31.550
C'est très facile.

00:21:31.550 --> 00:21:34.145
Je suppose que vous vous désabonnez ?

00:21:34.145 --> 00:21:35.835
C'est vrai. C'est plus difficile à

00:21:35.835 --> 00:21:38.685
vous désabonner parce que vous
n'ont pas plus égal.

00:21:38.685 --> 00:21:42.010
Permettez-moi de montrer aussi ce que vous
en fait envoyer ici.

00:21:42.010 --> 00:21:43.365
Donc, quand vous vous abonnez,

00:21:43.365 --> 00:21:46.395
vous passez le nom de la méthode.

00:21:46.395 --> 00:21:48.215
Vous passez une action,

00:21:48.215 --> 00:21:51.745
et compilateur fait un
grande tâche de cacher que,

00:21:51.745 --> 00:21:54.150
et nous faciliter la vie.

00:21:54.150 --> 00:21:55.945
Compilateur est très agréable.

00:21:55.945 --> 00:21:57.255
Très gentil avec nous.

00:21:57.255 --> 00:22:00.415
C'est pourquoi nous aimons être développeurs.

00:22:00.415 --> 00:22:04.360
Donc, il demande réellement pour
avec NSNotification.

00:22:04.360 --> 00:22:07.840
Donc, je signe NSNotification ici,

00:22:07.840 --> 00:22:13.365
et puis en utilisant cette notation,
coller cet objet.

00:22:13.365 --> 00:22:16.560
Donc, au lieu du nom de la méthode,

00:22:16.560 --> 00:22:19.225
nous sommes en train de passer
une action et un objet,

00:22:19.225 --> 00:22:20.960
qui fait référence à

00:22:20.960 --> 00:22:23.610
ces métadonnées sur la façon dont
d'appeler la méthode.

00:22:23.610 --> 00:22:26.555
Donc, nous ne passons pas la méthode,
c'est juste une référence.

00:22:26.555 --> 00:22:30.060
Dans notre cas, le plus important
partie lors de l'adoption de cette référence,

00:22:30.060 --> 00:22:32.155
qui est contrôleur UIV,

00:22:32.155 --> 00:22:34.170
et c'est pourquoi il est tenu en mémoire.

00:22:34.170 --> 00:22:35.260
Je l'ai.

00:22:35.260 --> 00:22:35.865
D'accord.

00:22:35.865 --> 00:22:36.670
C'est logique. Oui.

00:22:36.670 --> 00:22:38.595
Je ne montrerai pas les détails

00:22:38.595 --> 00:22:40.390
parce que la mémoire
fuite est toujours là

00:22:40.390 --> 00:22:43.975
parce que nous avons vu ces
chose pour gagner du temps.

00:22:43.975 --> 00:22:45.500
Je veux me concentrer sur

00:22:45.500 --> 00:22:48.830
le pire scénario qui
vous devriez être au courant.

00:22:48.830 --> 00:22:54.250
Quand le monde indigène ne place pas
bien avec le monde géré.

00:22:54.250 --> 00:22:56.280
Je t'ai eu. Lorsque le
deux mondes entrent en collision.

00:22:56.280 --> 00:23:00.265
C'est exact parce que chaque fois que
nous avons géré l'objet créé,

00:23:00.265 --> 00:23:02.155
et il y a un objet indigène créé,

00:23:02.155 --> 00:23:05.690
et il/elle essaie de
désaffecter les objets indigènes,

00:23:05.690 --> 00:23:07.495
notre monde géré pense,

00:23:07.495 --> 00:23:09.330
Je n'en ai toujours pas fini avec cet objet.

00:23:09.330 --> 00:23:11.270
S'll vous plaît, tenez bon, ne

00:23:11.270 --> 00:23:13.765
recueillir l'objet parce que
Je travaille toujours avec ça.

00:23:13.765 --> 00:23:14.525
Je t'ai eu.

00:23:14.525 --> 00:23:15.805
Il pourrait être en face,

00:23:15.805 --> 00:23:19.130
quand un monde indigène
pourrait créer un objet,

00:23:19.130 --> 00:23:20.265
et maintenant un monde géré pense,

00:23:20.265 --> 00:23:22.450
ce n'est pas fait, encore
là, alors maintenons.

00:23:22.450 --> 00:23:25.015
Même si vous n'avez pas d'autres
références à cet objet,

00:23:25.015 --> 00:23:29.015
il pourrait le tenir, il pourrait
le garder pas comme une poubelle.

00:23:29.015 --> 00:23:29.820
Je t'ai eu.

00:23:29.820 --> 00:23:31.460
Je pourrais l'expliquer avec

00:23:31.460 --> 00:23:34.640
ces petites images peu
d'objets immortels.

00:23:34.640 --> 00:23:37.230
Donc, ne créez pas immortel
Objets. C'est mauvais.

00:23:37.230 --> 00:23:38.435
Ca a l'air cool.

00:23:38.435 --> 00:23:39.963
Oui, c'est vrai.

00:23:39.963 --> 00:23:43.355
Cela arrive lorsque vous
ont ces deux mondes.

00:23:43.355 --> 00:23:46.925
Natif, vous voyez sur la droite le
contrôleur et vues d'affichage natifs,

00:23:46.925 --> 00:23:49.640
et de gauche vous avez

00:23:49.640 --> 00:23:52.580
monde géré C Sharp qui est
Afficher les contrôleurs et les vues.

00:23:52.580 --> 00:23:55.640
Chaque fois que vous ne savez pas ce qui est
qui se passe sur le monde indigène,

00:23:55.640 --> 00:23:58.070
vous ne pouvez pas collecter
il de ce monde.

00:23:58.070 --> 00:24:00.905
Je vais vous montrer un exemple
comment vous pouvez le faire.

00:24:00.905 --> 00:24:03.275
Donc, dans mon exemple,

00:24:03.275 --> 00:24:07.235
Je tiens à ajouter ici une petite
petit bouton "Enregistrer",

00:24:07.235 --> 00:24:11.375
et je veux juste fermer le
Afficher une fois que l'utilisateur frappe que.

00:24:11.375 --> 00:24:13.925
Supposons que le
Bouton "Enregistrer" fera également

00:24:13.925 --> 00:24:17.330
une base de données logiques d'enregistrement
ou HTTP appelle quoi que ce soit,

00:24:17.330 --> 00:24:19.055
il vient tout simplement pas revenir en arrière

00:24:19.055 --> 00:24:22.145
et il exécute effectivement
quelques mesures supplémentaires.

00:24:22.145 --> 00:24:22.775
D'accord.

00:24:22.775 --> 00:24:24.980
Comme détails de ces boutons,

00:24:24.980 --> 00:24:26.300
nous envoyons le gestionnaire.

00:24:26.300 --> 00:24:31.205
Ce gestionnaire dit que
s'il vous plaît fermer ces contrôleurs.

00:24:31.205 --> 00:24:33.395
Il me semble parfaitement légitime.

00:24:33.395 --> 00:24:35.255
Oui, c'est vrai. Nous vous présenterons
une fuite de mémoire.

00:24:35.255 --> 00:24:36.230
D'accord.

00:24:36.230 --> 00:24:42.515
Tu es mauvais. Il sera malheureusement
et c'est un modèle commun.

00:24:42.515 --> 00:24:45.005
Nous, nous n'avons pas
événement statique comme ici.

00:24:45.005 --> 00:24:47.195
Nous n'avons pas de
un seul ton comme ici.

00:24:47.195 --> 00:24:49.025
On garde juste ce bouton ici,

00:24:49.025 --> 00:24:51.650
c'est juste un élément local.

00:24:51.650 --> 00:24:54.260
D'accord James, maintenant nous
a créé un bouton et

00:24:54.260 --> 00:24:56.735
nous voulons l'ajouter à
notre vue de navigation.

00:24:56.735 --> 00:25:00.440
Nous avons donc dit en elle à travers le
élément de navigation également ne pas utiliser

00:25:00.440 --> 00:25:05.225
toutes les références statiques rien
comme ça et juste ça.

00:25:05.225 --> 00:25:08.015
Maintenant, nous avons le sous-bouton
et commençons le profileur.

00:25:08.015 --> 00:25:09.890
Oui et encore,
modèle super similaire.

00:25:09.890 --> 00:25:11.285
Je crée un bouton,

00:25:11.285 --> 00:25:15.800
ajouter un bouton, puis je pop le
Contrôleur d'vue semble normal.

00:25:15.800 --> 00:25:18.185
Avoir un délégué qui n'utilise pas

00:25:18.185 --> 00:25:20.540
toute référence externe ou statique

00:25:20.540 --> 00:25:23.225
et ne passe aucune référence
de notre contrôleur.

00:25:23.225 --> 00:25:23.750
Je t'ai eu.

00:25:23.750 --> 00:25:27.090
Si ça doit bien marcher,
Oui? Voyons.

00:25:27.280 --> 00:25:32.780
Ainsi, profiler affichera les objets

00:25:32.780 --> 00:25:34.760
créé au tout début et je suis

00:25:34.760 --> 00:25:37.790
va commencer à suivre
eux au tout début.

00:25:37.790 --> 00:25:39.530
J'ai donc caché des instantanés à droite

00:25:39.530 --> 00:25:42.455
maintenant et le filtrage de mes objets seulement.

00:25:42.455 --> 00:25:45.380
Encore une fois est très commun
modèle à dépanner

00:25:45.380 --> 00:25:48.800
problèmes de mémoire juste pour
voir seulement mes objets.

00:25:48.800 --> 00:25:52.235
Puis je suis parti une fois là-bas.
C'est mon bouton.

00:25:52.235 --> 00:25:55.565
Vous voyez, c'est un nouveau contrôle
bien notre application.

00:25:55.565 --> 00:25:56.870
Nous avons ceci dans la mémoire,

00:25:56.870 --> 00:25:58.745
ce qui est vrai, nous nous attendons à cela.

00:25:58.745 --> 00:26:03.410
En revenant, nous allons frapper un
plus de temps et une fois de plus.

00:26:03.410 --> 00:26:04.430
Une fois de plus parce que je sais.

00:26:04.430 --> 00:26:05.195
Une fois de plus.

00:26:05.195 --> 00:26:06.380
D'accord, et toujours là.

00:26:06.380 --> 00:26:08.270
Une fois de plus, il est toujours là.

00:26:08.270 --> 00:26:11.030
Alors ouvrons-le et beaucoup plus de fois.

00:26:11.030 --> 00:26:14.090
Fermons aussi
façon différente de revenir en arrière,

00:26:14.090 --> 00:26:17.390
va sauver, il fait en fait
essentiellement faire la même chose.

00:26:17.390 --> 00:26:20.090
Nous allons frapper le "Mémoire
instantané" un de plus

00:26:20.090 --> 00:26:22.610
temps et oh wow nous
ont cinq cas de

00:26:22.610 --> 00:26:24.920
pages accrochées là dans
mémoire et si vous avez

00:26:24.920 --> 00:26:28.130
une image énorme il il
aura beaucoup de mémoire

00:26:28.130 --> 00:26:28.550
Je l'ai.

00:26:28.550 --> 00:26:32.615
C'est donc un modèle très courant

00:26:32.615 --> 00:26:36.800
parce qu'il n'est pas évident que
vous avez une fuite de mémoire ici.

00:26:36.800 --> 00:26:39.830
La question ici est
que UiBarButtonItem

00:26:39.830 --> 00:26:43.910
détient réellement à
une ressource indigène,

00:26:43.910 --> 00:26:45.485
il est lié à la ressource indigène.

00:26:45.485 --> 00:26:49.100
Si nous ne disons pas clairement que
Je n'ai plus besoin de ce bouton,

00:26:49.100 --> 00:26:51.020
vous allez introduire
cet objet immortel.

00:26:51.020 --> 00:26:53.135
Je t'ai eu. Alors, comment faire
Je résout ce truc ?

00:26:53.135 --> 00:26:56.240
Pour résoudre ce problème, utilisons

00:26:56.240 --> 00:26:59.900
notre événement ViewDisappear et
faire quelque chose avec notre bouton.

00:26:59.900 --> 00:27:00.150
D'accord.

00:27:00.150 --> 00:27:01.220
Nous avons donc deux options,

00:27:01.220 --> 00:27:02.735
nous pourrions soit utiliser

00:27:02.735 --> 00:27:05.299
Événement cliqué et
s'abonner et se désabonner,

00:27:05.299 --> 00:27:07.160
mais nous serons de retour à

00:27:07.160 --> 00:27:10.400
notre premier article lorsque nous nous abonner
sans se désabonner.

00:27:10.400 --> 00:27:12.560
Faisons quelque chose de plus intéressant.

00:27:12.560 --> 00:27:14.030
On va régler le bouton.

00:27:14.030 --> 00:27:15.680
J'aime ça. Je suis
fait avec elle, non?

00:27:15.680 --> 00:27:18.320
Oui, nous disons en quelque sorte
monde géré qui,

00:27:18.320 --> 00:27:20.495
"J'en ai fini avec le bouton
s'il vous plaît disposer.

00:27:20.495 --> 00:27:24.365
Ce n'est pas évident parce que
beaucoup de vues et d'emballages

00:27:24.365 --> 00:27:26.540
à Xamarin iOS ont
cette méthode d'élimination et

00:27:26.540 --> 00:27:29.015
vous ne savez pas vraiment quand
tu devrais appeler ça.

00:27:29.015 --> 00:27:30.815
C'est donc un cas intéressant.

00:27:30.815 --> 00:27:32.975
Mais faisons ça et courons.

00:27:32.975 --> 00:27:34.700
C'est la seule action que j'ai ajoutée

00:27:34.700 --> 00:27:37.500
depuis l'exécution de l'application précédente.

00:27:38.290 --> 00:27:42.530
Je commence le profileur
et faire le même cas d'utilisation.

00:27:42.530 --> 00:27:44.000
Nous allons suivre les objets à partir de

00:27:44.000 --> 00:27:46.310
le tout début et de faire
sûr qu'ils sont éliminés.

00:27:46.310 --> 00:27:48.050
Très cool. C'est sympa.

00:27:48.050 --> 00:27:49.670
Donc tu aurais pu, comme tu l'as dit,

00:27:49.670 --> 00:27:53.270
au lieu de passer
toute cette action dans,

00:27:53.270 --> 00:27:55.130
vous pouvez tout simplement similaire à la façon dont nous

00:27:55.130 --> 00:27:57.605
ne Connectivité,
s'abonner, se désabonner,

00:27:57.605 --> 00:28:00.590
Je l'aurais pensé
, mais dans ce cas,

00:28:00.590 --> 00:28:03.125
vous êtes déjà fait si
vous vous en débarrassez.

00:28:03.125 --> 00:28:04.010
C'est vrai.

00:28:04.010 --> 00:28:04.875
Cool.

00:28:04.875 --> 00:28:08.455
Oui, parce que nous n'avons pas
s'attendre à ce qu'il soit désabonné.

00:28:08.455 --> 00:28:10.840
Ce n'est pas une sorte d'abonnement,

00:28:10.840 --> 00:28:14.230
nous venons de passer et de déléguer
à l'intérieur de l'objet local.

00:28:14.230 --> 00:28:16.045
Dans le cas de NotificationCenter,

00:28:16.045 --> 00:28:18.790
c'est une sorte d'abonnement parce que
nous passons dans l'objet local

00:28:18.790 --> 00:28:21.760
dans certains statiques
exemple ou singleton.

00:28:21.760 --> 00:28:24.760
Dans ce cas, nous venons d'utiliser
dans nos ressources locales,

00:28:24.760 --> 00:28:26.395
nous ne nous attendons pas à une fuite de mémoire.

00:28:26.395 --> 00:28:26.680
Je t'ai eu.

00:28:26.680 --> 00:28:28.630
Mais malheureusement, je peux voir

00:28:28.630 --> 00:28:32.660
cette barrière beaucoup et les gens
se trouver dans ces situations.

00:28:32.680 --> 00:28:37.530
Faisons la même chose.

00:28:37.750 --> 00:28:41.760
J'aimerais qu'il puisse enregistrer ces données.

00:28:41.950 --> 00:28:46.310
Donc, nous n'avons qu'une vue
Contrôleur et délégué.

00:28:46.310 --> 00:28:48.290
On va frapper "Save".

00:28:48.290 --> 00:28:51.215
Revenons en arrière.

00:28:51.215 --> 00:28:54.005
Restons en fait à la page des détails.

00:28:54.005 --> 00:28:56.975
Appuyez sur "Memory snapshot" et nous en voyons un.

00:28:56.975 --> 00:28:59.315
Permettez-moi de cliquer un peu plus de fois.

00:28:59.315 --> 00:29:02.735
On en reparlera. Donc, nous
n'ont qu'une seule instance ici.

00:29:02.735 --> 00:29:10.805
Je clique sur "Enregistrer", cliquez sur "Snapshot"
et il disparaît scan.

00:29:10.805 --> 00:29:12.380
d'accord? Fuite de mémoire fixe.

00:29:12.380 --> 00:29:13.250
Très cool. Belle.

00:29:13.250 --> 00:29:14.900
L'objet immortel a été tué.

00:29:14.900 --> 00:29:16.445
Tué. Très cool.

00:29:16.445 --> 00:29:17.810
Sinon, c'est génial.

00:29:17.810 --> 00:29:20.600
Si simple, regardez vos événements,

00:29:20.600 --> 00:29:22.850
mais regardez aussi comment vous passez

00:29:22.850 --> 00:29:24.890
ces actions autour et même je

00:29:24.890 --> 00:29:26.870
ne serait même pas penser à cela
bouton pour être honnête avec vous

00:29:26.870 --> 00:29:29.315
parce que le constructeur
passe cette chose.

00:29:29.315 --> 00:29:29.600
Oui, c'est vrai.

00:29:29.600 --> 00:29:30.725
Tellement cool.

00:29:30.725 --> 00:29:33.350
Je recommanderais aussi de

00:29:33.350 --> 00:29:36.425
nos développeurs de l'utiliser plus
souvent à aimer une fois par semaine,

00:29:36.425 --> 00:29:39.545
chaque sprint, puis à
voir l'utilisation de la mémoire,

00:29:39.545 --> 00:29:41.585
vous pouvez le voir comme un essai d'interface uI.

00:29:41.585 --> 00:29:45.590
Il montre ce petit
ensemble de travail de mémoire.

00:29:45.590 --> 00:29:48.050
Donc, vous venez de voir plus
mois si elle grandit ou

00:29:48.050 --> 00:29:51.530
pas et si elle vous pousse
probablement une fuite de mémoire.

00:29:51.530 --> 00:29:53.360
Vous avez montré iOS.

00:29:53.360 --> 00:29:54.560
Maintenant, qu'en est-il pour Android?

00:29:54.560 --> 00:29:57.500
Y a-t-il d'autres
outils là que vous pouvez utiliser?

00:29:57.500 --> 00:29:59.465
C'est une bonne question
parce que, Android,

00:29:59.465 --> 00:30:02.000
tout ce dont nous avons parlé
iOS s'applique pour Android.

00:30:02.000 --> 00:30:02.150
Je t'ai eu.

00:30:02.150 --> 00:30:03.440
Il suffit d'avoir un outil différent pour

00:30:03.440 --> 00:30:07.145
Profiler natif Android
appelé Android Profiler.

00:30:07.145 --> 00:30:08.390
C'est vraiment cool.

00:30:08.390 --> 00:30:09.740
Il vous montre beaucoup de

00:30:09.740 --> 00:30:12.380
informations, mais vous avez encore
d'avoir à l'utiliser qui est

00:30:12.380 --> 00:30:14.330
le profileur Xamarin en conjonction

00:30:14.330 --> 00:30:16.790
en raison de gérés
monde et le monde indigène.

00:30:16.790 --> 00:30:17.930
Je t'ai eu. Il suffit qu'il

00:30:17.930 --> 00:30:19.340
sons, il était cool que
il ya d'excellents outils

00:30:19.340 --> 00:30:22.400
disponible, peu importe où
vous êtes à, iOS, Android.

00:30:22.400 --> 00:30:23.240
C'est exact.

00:30:23.240 --> 00:30:24.005
Je peux aller de l'avant et le faire.

00:30:24.005 --> 00:30:25.820
Honnêtement, juste à la recherche
à certains d'entre eux,

00:30:25.820 --> 00:30:28.160
Je suis presque sûr que mon code,
il y a beaucoup de mauvaises choses.

00:30:28.160 --> 00:30:29.480
Donc, quand je diffuserai ensuite,

00:30:29.480 --> 00:30:31.790
ça va être tout
réparer mes fuites de mémoire.

00:30:31.790 --> 00:30:32.180
D'accord.

00:30:32.180 --> 00:30:34.280
Très cool. Tout le reste Alexi
que vous voulez parler?

00:30:34.280 --> 00:30:35.315
C'est tout pour aujourd'hui.

00:30:35.315 --> 00:30:37.865
C'est génial. Eh bien, merci
tout le monde pour l'adage.

00:30:37.865 --> 00:30:40.010
Alexi, merci beaucoup pour
montrer toutes ces choses.

00:30:40.010 --> 00:30:42.305
Merci les gars. Remercier
vous James pour m'avoir laissé.

00:30:42.305 --> 00:30:43.970
Absolument, et assurez-vous

00:30:43.970 --> 00:30:45.920
que vous consultez tous les
les notes du spectacle ci-dessous,

00:30:45.920 --> 00:30:47.420
ouvrir toute la source
code, tous les liens

00:30:47.420 --> 00:30:48.980
pour toute la documentation là-bas.

00:30:48.980 --> 00:30:51.740
Vous pouvez également aller à aka.ms/Xamarin

00:30:51.740 --> 00:30:54.485
pratiques exemplaires pour l'ensemble de la série.

00:30:54.485 --> 00:30:55.790
Alors assurez-vous de vous abonner

00:30:55.790 --> 00:30:57.695
aujourd'hui où que vous soyez
regarder en ce moment.

00:30:57.695 --> 00:30:59.090
Je suis James Montemagno.

00:30:59.090 --> 00:31:01.790
Cela a été le Xamarin
Montrez et merci pour regarder.

00:31:01.790 --> 00:31:02.480
Merci les gars.

00:31:02.480 --> 00:31:09.230
[MUSIQUE]

00:31:09.230 --> 00:31:11.120
Hé, James.
Je voulais juste m'enregistrer.

00:31:11.120 --> 00:31:13.175
et je vous remercie pour
regarder cette vidé o.

00:31:13.175 --> 00:31:16.265
Maintenant, faites toutes les choses que vous
savoir que vous voulez faire comme,

00:31:16.265 --> 00:31:18.710
s'abonner, et ding
que la sonnette de notification,

00:31:18.710 --> 00:31:20.825
faire partie de la
l'escouade de notification.

00:31:20.825 --> 00:31:22.190
Pendant que vous êtes ici, vérifiez

00:31:22.190 --> 00:31:25.400
toutes ces vidé os géniales
que j'ai déjà codé.

00:31:25.400 --> 00:31:29.040
Cliquez sur ce truc. Cliquez sur
il, regardez-le, faites-le.

