WEBVTT

00:00:00.000 --> 00:00:01.680
>> Tune in diese Woche
Xamarin Zeigen, wo

00:00:01.680 --> 00:00:03.360
mein guter Freund Alexi beim Reden

00:00:03.360 --> 00:00:06.810
Informationen zur Speicherverwaltung für
Ihre Anwendungen. Also stimmen Sie sich ein.

00:00:06.810 --> 00:00:13.200
[MUSIK]

00:00:13.200 --> 00:00:14.280
>> Willkommen zurück, alle,

00:00:14.280 --> 00:00:15.405
zur Xamarin Show.

00:00:15.405 --> 00:00:16.650
Ich bin dein Gastgeber James Montemagno.

00:00:16.650 --> 00:00:17.820
Heute, mein bester Freund in

00:00:17.820 --> 00:00:21.270
die ganze Welt Alexi mit
Ich. Wie geht es, Kumpel?

00:00:21.270 --> 00:00:22.905
>> Ich bin gut. Wie steht es mit dir?

00:00:22.905 --> 00:00:24.960
>> Ich mache fantastisch.
Es ist ein schöner Tag

00:00:24.960 --> 00:00:26.640
hier in Redmond, Washington jeden Tag.

00:00:26.640 --> 00:00:27.325
>> Es ist.

00:00:27.325 --> 00:00:29.085
>> Jetzt sind Sie von unserem Handy

00:00:29.085 --> 00:00:31.065
Kundenberatung
Team, ist das richtig?

00:00:31.065 --> 00:00:31.920
>> Das ist richtig.

00:00:31.920 --> 00:00:33.450
>> Was bedeutet das?

00:00:33.450 --> 00:00:35.370
>> Es bedeutet, dass wir mit

00:00:35.370 --> 00:00:38.250
unsere Kunden und
sie natürlich zu beraten.

00:00:38.250 --> 00:00:41.645
Aber meistens arbeiten wir mit Entwicklern
und sehen, wie sie Werkzeuge verwenden,

00:00:41.645 --> 00:00:44.300
wie sie mit unserem Xamarin-Tool arbeiten,

00:00:44.300 --> 00:00:47.560
und was sind die gemeinsamen
Fallstricke, mit denen sie konfrontiert sind.

00:00:47.560 --> 00:00:48.420
>> Perfekt.

00:00:48.420 --> 00:00:50.205
>> Heute möchte ich über

00:00:50.205 --> 00:00:52.355
einer davon ist die Speicherverwaltung.

00:00:52.355 --> 00:00:53.780
>> Sie haben sie. Ja. Es ist sehr wichtig

00:00:53.780 --> 00:00:55.730
weil wir oft reden
über all die coolen,

00:00:55.730 --> 00:00:57.155
ausgefallene Funktionen, die Sie tun können,

00:00:57.155 --> 00:01:00.440
aber wir wollten, dass
Best-Practice-Serie

00:01:00.440 --> 00:01:02.340
weil Sie in Schwierigkeiten geraten.

00:01:02.340 --> 00:01:03.820
Es passiert. Es ist so einfach zu tun.

00:01:03.820 --> 00:01:06.345
Speicherverwaltung,
ehrlich gesagt, ich bin ein Noob.

00:01:06.345 --> 00:01:07.770
Ich weiß es wirklich nicht. Ich bin einfach wie,

00:01:07.770 --> 00:01:09.560
"Sie werden töten
meine App in fünf Sekunden.

00:01:09.560 --> 00:01:11.705
Es spielt keine Rolle, oder?" Aber
Ich sollte nicht so denken.

00:01:11.705 --> 00:01:14.210
>> Das stimmt. Das sehen wir

00:01:14.210 --> 00:01:16.850
weil sich niemand um
die Speicherverwaltung.

00:01:16.850 --> 00:01:21.300
Wir haben so viel Erinnerung
und Sie überprüfen sie nie.

00:01:21.300 --> 00:01:24.750
Ich meine, wann war das letzte Mal, dass Sie
Haben Sie Ihre App-Speichernutzung überprüft?

00:01:24.750 --> 00:01:26.250
>> Das letzte Mal habe ich einen Absturz bekommen.

00:01:26.250 --> 00:01:29.510
Eigentlich hatte ich eine sehr
ein gutes Beispiel dafür.

00:01:29.510 --> 00:01:31.910
Das sage ich Ihnen. das
ist ein Beispiel aus der Praxis.

00:01:31.910 --> 00:01:35.120
Ich habe einen Fehler in Xamarin Essentials

00:01:35.120 --> 00:01:38.375
das sagt, wenn ich anrufe
diese Methode 20.000 Mal,

00:01:38.375 --> 00:01:41.570
meine App stürzt ab und es
war, weil ich nicht war

00:01:41.570 --> 00:01:45.155
ordnungsgemäßen Entsorgung einer
natives Android-Objekt,

00:01:45.155 --> 00:01:46.775
ein Fenster, eine Anzeige.

00:01:46.775 --> 00:01:48.170
Was also passiert, ist,

00:01:48.170 --> 00:01:50.480
Ich würde es weiter schaffen
und es würde nie bekommen

00:01:50.480 --> 00:01:53.135
Müll gesammelt, weil
Ich habe es nie entsorgt.

00:01:53.135 --> 00:01:54.890
>> Das ist es, was wir tun werden
heute zu sprechen.

00:01:54.890 --> 00:01:56.925
>> Ja. Prima. Lassen Sie uns tun
Es. Was haben Sie für uns?

00:01:56.925 --> 00:02:00.435
>> So haben wir diese kleine
einfache App mit zwei Fenstern,

00:02:00.435 --> 00:02:02.745
Hauptbildschirm und Detailbildschirm.

00:02:02.745 --> 00:02:06.375
Das ist ein sehr häufiges Muster
UI-Navigationscontroller.

00:02:06.375 --> 00:02:09.600
Dies ist ein schlichter Xamarin
iOS-Anwendung, nicht wahr?

00:02:09.600 --> 00:02:10.305
>> Okay.

00:02:10.305 --> 00:02:12.440
>> Was wir gehen
zu tun ist, einzuführen

00:02:12.440 --> 00:02:14.930
Speicherverluste in vielen,
viele verschiedene Arten.

00:02:14.930 --> 00:02:19.025
Aber zuerst möchte ich über
die Unterschiede zur einheimischen Welt

00:02:19.025 --> 00:02:23.960
und verwaltete Welt
Leistung und Speicher.

00:02:23.960 --> 00:02:25.340
Also, wenn Sie einen Prozess haben,

00:02:25.340 --> 00:02:27.995
Betriebssystem geben
Sie einen Speicherabschnitt.

00:02:27.995 --> 00:02:31.370
Sie sollten sich darüber im Klaren sein, dass
denn sobald Ihnen der Speicher ausgeht,

00:02:31.370 --> 00:02:33.670
Ihre App stürzt ab oder
Betriebssystem tötet es.

00:02:33.670 --> 00:02:35.355
Im verwalteten Speicher

00:02:35.355 --> 00:02:40.260
unser Xamarin Mono bekommt diese
ein kleines Stück dieses Speichers.

00:02:40.260 --> 00:02:41.630
Das ist der Zeitpunkt, an dem wir

00:02:41.630 --> 00:02:43.670
vorsichtig darüber, wie wir
verwenden Sie auch dieses Stück.

00:02:43.670 --> 00:02:44.030
>> Okay.

00:02:44.030 --> 00:02:46.640
>> So sollten Sie immer noch
sich des nativen Speichers bewusst sind,

00:02:46.640 --> 00:02:48.905
und jetzt, wenn Sie mit Xamarin arbeiten,

00:02:48.905 --> 00:02:50.320
auch über den Management-Teil bewusst sind.

00:02:50.320 --> 00:02:52.740
>> Haben Sie es. Sie haben also
nativen Speicher, iOS,

00:02:52.740 --> 00:02:55.980
Android-Bits und -Stücke,
.NET verwalteter Speicher?

00:02:55.980 --> 00:02:56.640
>> Das stimmt.

00:02:56.640 --> 00:02:57.090
>> Perfekt.

00:02:57.090 --> 00:03:00.530
>> Wann immer Sie ein Objekt erstellen
und sie erstellen, sagen wir,

00:03:00.530 --> 00:03:02.330
eine UI-Schaltfläche, die Sie tatsächlich erstellen

00:03:02.330 --> 00:03:04.950
eine native UI-Schaltfläche und
verwaltete UI-Schaltflächenklasse.

00:03:04.950 --> 00:03:06.680
Sie haben unterschiedliche Gedächtnisauswirkungen.

00:03:06.680 --> 00:03:10.310
Sie könnten zu unterschiedlichen
Speicherprobleme, da

00:03:10.310 --> 00:03:14.135
auch eine einheimische Art zu sammeln
Müll und verwaltete Art und Weise.

00:03:14.135 --> 00:03:20.385
In Mono verwenden wir Mono Single
Generation Garbage Collector.

00:03:20.385 --> 00:03:23.460
In der muttersprachlichen Welt verwendet iOS ARC,

00:03:23.460 --> 00:03:26.680
Android verwenden seine eigenen
Müllsammler,

00:03:26.680 --> 00:03:29.420
aber sie sollten zusammenarbeiten
Seite an Seite und wir sollten

00:03:29.420 --> 00:03:32.300
haben, weil Sie
Probleme zu lösen, indem sie dies verwenden.

00:03:32.300 --> 00:03:32.690
>> Haben Sie es.

00:03:32.690 --> 00:03:34.640
>> So ist die erste und

00:03:34.640 --> 00:03:36.950
der einfachste Ansatz zur Einführung

00:03:36.950 --> 00:03:40.830
Ein Speicherproblem ist ein Abonnement
ohne Abmeldung.

00:03:42.040 --> 00:03:45.680
Müllsammler sollte es wissen
wenn ein Müll vorhanden ist.

00:03:45.680 --> 00:03:47.180
Aber wie konnte er es wissen?

00:03:47.180 --> 00:03:49.565
Es sollte in der Lage sein,

00:03:49.565 --> 00:03:53.915
ein Erreichbarkeitsbaumdiagramm
und es beginnt bei den Routen.

00:03:53.915 --> 00:03:57.320
Unsere statischen Ereignisse, statischen Variablen,

00:03:57.320 --> 00:03:59.350
statische Ereignisse oder Threadroll-Aufrufe,

00:03:59.350 --> 00:04:01.910
sie sind alle erreichbare Routen und

00:04:01.910 --> 00:04:05.005
Garbage Collector behandelt
sie als nicht Müll.

00:04:05.005 --> 00:04:06.810
Also, wenn Sie so abonnieren,

00:04:06.810 --> 00:04:09.560
nehmen wir Konnektivität-Plugin.

00:04:09.560 --> 00:04:11.960
Ich weiß, James, du bist
mit diesem Plugin vertraut sind.

00:04:11.960 --> 00:04:13.400
>> Ich bin es. Ja. Sehr viel sogar.

00:04:13.400 --> 00:04:14.960
Das gefällt mir. In
hier sind wir genau was?

00:04:14.960 --> 00:04:16.220
Abonnieren eines Ereignisses,

00:04:16.220 --> 00:04:18.610
und es könnte jede
Ereignisse wie Click-Event,

00:04:18.610 --> 00:04:20.360
Sie haben ein Sensorwechselereignis.

00:04:20.360 --> 00:04:22.715
Im Grunde alles jemals in .NET.

00:04:22.715 --> 00:04:25.970
>> Ja. Es ist spezifisch
nicht nur zu Xamarin.

00:04:25.970 --> 00:04:27.830
Es ist jedes statische Ereignis

00:04:27.830 --> 00:04:31.745
in .NET und Konnektivität
hier ist nur ein Beispiel.

00:04:31.745 --> 00:04:35.390
Was ich zu sagen versuche,
kann ein statisches Ereignis oder

00:04:35.390 --> 00:04:38.960
jedes von Singleton bereitgestellte Ereignis.

00:04:38.960 --> 00:04:40.880
Also, wenn wir so abonnieren,

00:04:40.880 --> 00:04:42.520
und sagen wir, wir haben

00:04:42.520 --> 00:04:47.100
dieses kleine kleine Stück
ConnectivityChanged-Handler.

00:04:47.100 --> 00:04:49.655
Wir führen ein kleines Speicherleck ein.

00:04:49.655 --> 00:04:54.290
Es ist klein, weil unsere Sicht
ziemlich einfach und leicht,

00:04:54.290 --> 00:04:55.400
aber es ist ein Speicherleck.

00:04:55.400 --> 00:04:57.685
>> Es ist also ein Speicherleck, warum aber?

00:04:57.685 --> 00:05:00.860
>> Weil diese Konnektivität und

00:05:00.860 --> 00:05:03.830
ConnectivityChanged-Ereignis
ist ein statischer Verweis

00:05:03.830 --> 00:05:05.270
für unseren Müllsammler.

00:05:05.270 --> 00:05:06.980
Einmal unser Müll
Sammler versucht,

00:05:06.980 --> 00:05:08.810
identifizieren, ob es sich um einen Müll handelt oder nicht,

00:05:08.810 --> 00:05:11.015
es liegt nicht daran, dass

00:05:11.015 --> 00:05:14.540
ConnectivityChanged-Ereignis hat
einen Verweis auf diesen Handler,

00:05:14.540 --> 00:05:17.375
und dieser Handler verarbeitet tatsächlich

00:05:17.375 --> 00:05:21.080
den Verweis auf unsere
DetailsViewController.

00:05:21.080 --> 00:05:24.680
>> Ich sehe. Ich hab es. So haben wir
dieses Ereignis innerhalb der

00:05:24.680 --> 00:05:29.600
viewController und ich habe
abonniert, aber nie abgemeldet.

00:05:29.600 --> 00:05:31.970
So hat es immer diese
sofort referenzieren.

00:05:31.970 --> 00:05:34.940
So sagt Müllsammler:
"Hey, was gibt es?"

00:05:34.940 --> 00:05:37.030
Es heißt: "Das kannst du nicht haben."

00:05:37.030 --> 00:05:38.205
>> Das ist richtig.

00:05:38.205 --> 00:05:40.580
>> Ich möchte sicherstellen, dass
das ist richtig, weil ich

00:05:40.580 --> 00:05:42.185
glauben, dass dies der Fall ist,
es funktioniert in meinem Kopf.

00:05:42.185 --> 00:05:43.150
Ich möchte sicherstellen, dass ich Recht habe.

00:05:43.150 --> 00:05:47.225
>> Der Einzelne-Task-Garbage Collector
tut, speicherzuverteilen,

00:05:47.225 --> 00:05:48.605
und das richtig zu machen,

00:05:48.605 --> 00:05:50.540
Müllsammler sollte wissen, wie man

00:05:50.540 --> 00:05:52.730
richtig identifizieren, ob
es ist Müll oder nicht.

00:05:52.730 --> 00:05:53.180
>> Haben Sie es.

00:05:53.180 --> 00:05:55.790
>> Um also einen Erreichbarkeitsbaum zu bauen,

00:05:55.790 --> 00:05:59.270
ein Garbage Collector
verwendet statische Routen oder

00:05:59.270 --> 00:06:01.430
nur Routen und statische Ereignisse

00:06:01.430 --> 00:06:03.500
oder eine statische Eigenschaft
als eine der Routen.

00:06:03.500 --> 00:06:06.460
Auch lokale Variablen,
viele andere Sachen.

00:06:06.460 --> 00:06:07.020
>> Haben Sie es.

00:06:07.020 --> 00:06:11.820
>> Also lass mich es einfach laufen lassen
und zeigen, wie es funktioniert.

00:06:11.820 --> 00:06:14.745
Glauben Sie, dass wir
einen Unterschied sehen?

00:06:14.745 --> 00:06:17.540
>> Ich weiß es nicht. Ich meine
hoffentlich nicht, weil

00:06:17.540 --> 00:06:20.090
es ist so einfach, was ich denke.

00:06:20.090 --> 00:06:22.160
Nun aber ist meine Angst, dass

00:06:22.160 --> 00:06:24.200
da wir uns über
und immer wieder,

00:06:24.200 --> 00:06:26.750
wenn wir Ereignisse ändern,

00:06:26.750 --> 00:06:28.850
wir werden wahrscheinlich
in vielen Veranstaltungen.

00:06:28.850 --> 00:06:30.635
>> ja. Lassen Sie uns es überprüfen.

00:06:30.635 --> 00:06:33.560
Also bin ich zur Detailseite gewechselt.

00:06:33.560 --> 00:06:36.185
Ich werde mein WLAN jetzt trennen.

00:06:36.185 --> 00:06:38.510
>> Hier verwenden wir
iOS Simulator.

00:06:38.510 --> 00:06:41.975
So ist es tatsächlich mit
das Internet der Maschine.

00:06:41.975 --> 00:06:46.460
>> Ja. Wir haben gerade eine Veranstaltung hier
die ConnectivityChanged sind.

00:06:46.460 --> 00:06:51.910
Lassen Sie uns ein paar Mal zurückgehen
und noch ein paar Mal,

00:06:51.910 --> 00:06:54.630
und ich bin wieder auf der Hauptseite.

00:06:54.630 --> 00:06:58.215
Ich bin nicht zart in
alles im Moment,

00:06:58.215 --> 00:07:01.280
und ich gehe davon aus, dass meine
Seite sind nicht mehr da, nicht wahr?

00:07:01.280 --> 00:07:01.430
>> ja.

00:07:01.430 --> 00:07:02.810
>> Mein Abonnement-Handler

00:07:02.810 --> 00:07:04.805
sollte nicht funktionieren, weil
Ich habe nichts getan.

00:07:04.805 --> 00:07:07.015
Schalten wir das WLAN ein.

00:07:07.015 --> 00:07:09.510
>> Okay. So haben wir tatsächlich

00:07:09.510 --> 00:07:11.910
Diese ConnectivityChanged
auf der zweiten Seite.

00:07:11.910 --> 00:07:12.420
>> Zweite Seite.

00:07:12.420 --> 00:07:13.665
>> Nun, ich bin auf der ersten Seite.

00:07:13.665 --> 00:07:17.440
>> Ja. Wir erwarten also nicht, dass
unser Handler zur Arbeit,

00:07:17.440 --> 00:07:18.645
aber schauen Sie, was wir bekommen haben.

00:07:18.645 --> 00:07:21.090
Wir haben gerade vier Handler
unseren Code auszuführen,

00:07:21.090 --> 00:07:23.600
und es könnte jede
Codeaktualisierungsdatenbank,

00:07:23.600 --> 00:07:25.505
Speichereinstellungen, was auch immer.

00:07:25.505 --> 00:07:28.070
Das Problem hier nicht nur
mit Speicherverwaltung

00:07:28.070 --> 00:07:30.635
weil es etwas Speicher braucht.

00:07:30.635 --> 00:07:34.970
Es ist auch ein Problem, weil wir
Code, der ebenfalls ausgeführt werden soll.

00:07:34.970 --> 00:07:37.445
>> Dann bedeutet das, dass
dass die Detailseite,

00:07:37.445 --> 00:07:39.350
jetzt kann es nie
Müll gesammelt?

00:07:39.350 --> 00:07:42.455
Jetzt habe ich nur diese
Detailseite immer im Speicher.

00:07:42.455 --> 00:07:43.400
>> Leider ja.

00:07:43.400 --> 00:07:44.660
>> Oh meine Güte, das ist schlecht.

00:07:44.660 --> 00:07:47.385
>> Das ist schlecht. Als Entwickler

00:07:47.385 --> 00:07:49.560
das sehen wir nicht immer.

00:07:49.560 --> 00:07:54.280
Als Benutzer sehe ich, dass meine App abstürzt
wie einmal pro Woche, was auch immer.

00:07:54.280 --> 00:07:56.675
Ich werde es einfach neu starten
und weiterhin verwenden.

00:07:56.675 --> 00:07:58.220
Deshalb wird nicht berichtet,

00:07:58.220 --> 00:08:00.350
es wird nicht sehr ernst genommen,

00:08:00.350 --> 00:08:03.950
aber es ist ein Problem, vor allem, wenn Sie

00:08:03.950 --> 00:08:08.330
ein riesiges Bild bekommen
die ihr Gedächtnis beeinflusst.

00:08:08.330 --> 00:08:10.910
Also werde ich mich entkommentieren
diese Codezeile,

00:08:10.910 --> 00:08:14.680
was tatsächlich zu einer gewissen Speicherlast führt

00:08:14.680 --> 00:08:19.740
hier und es lädt eine
Bild aus dem Internet.

00:08:19.740 --> 00:08:22.265
Wir machen nur ein zufälliges Bild.

00:08:22.265 --> 00:08:24.815
Lassen Sie mich zeigen, dass es wirklich zufällig ist.

00:08:24.815 --> 00:08:27.035
Mal sehen, was wir hier bekommen.

00:08:27.035 --> 00:08:29.510
Ich mache mir immer Sorgen.

00:08:29.510 --> 00:08:32.210
Okay. So haben wir dieses zufällige Bild,

00:08:32.210 --> 00:08:34.370
und das ist es, was wir
zu laden

00:08:34.370 --> 00:08:37.190
unsere App jedes Mal, wenn wir
gehen Sie in die Detailseite.

00:08:37.190 --> 00:08:37.610
>> Okay.

00:08:37.610 --> 00:08:40.395
>> Lassen Sie mich es hier zeigen.

00:08:40.395 --> 00:08:42.970
>> Das ist total etwas
dass, was immer passiert, nicht wahr?

00:08:42.970 --> 00:08:45.220
Da gehen Sie zu einer Detailseite,

00:08:45.220 --> 00:08:46.740
wahrscheinlich einige Informationen laden,

00:08:46.740 --> 00:08:48.080
könnte einige ziehen
Informationen von

00:08:48.080 --> 00:08:51.095
eine Datenbank auf diesem Bildschirm,
und das könnte schlecht sein.

00:08:51.095 --> 00:08:53.930
>> Stellen Sie sich vor, Sie sind
mit der Instagram-App.

00:08:53.930 --> 00:08:55.330
Sie haben dort eine Detailseite.

00:08:55.330 --> 00:08:56.710
Sie tippen und folgen,

00:08:56.710 --> 00:08:58.435
ins Detail gehen, zurückgegangen.

00:08:58.435 --> 00:09:00.720
Überprüfen Sie einen anderen Ordner,
ins Detail gehen,

00:09:00.720 --> 00:09:03.920
zurück, und in einer Woche Ihre App
abstürzt und niemand weiß warum.

00:09:03.920 --> 00:09:06.680
Das ist, wenn Speicherprobleme
könnte ins Spiel kommen.

00:09:06.680 --> 00:09:09.180
>> Sie haben sie.

00:09:09.180 --> 00:09:11.855
>> Ich zeige Ihnen nicht, dass
Speicherleck ist immer noch da

00:09:11.855 --> 00:09:14.650
weil ich zeigen möchte
Sie der Profiler,

00:09:14.650 --> 00:09:16.375
wie Sie diese Probleme identifizieren können.

00:09:16.375 --> 00:09:17.800
Um diese Probleme zu identifizieren,

00:09:17.800 --> 00:09:19.990
Sie haben ein paar Werkzeuge.

00:09:19.990 --> 00:09:23.350
Zuallererst sind es native Werkzeuge,
iOs bietet Instrumente,

00:09:23.350 --> 00:09:25.520
und zweitens ist verwaltetes Werkzeug,

00:09:25.520 --> 00:09:27.005
xamarin Profiler.

00:09:27.005 --> 00:09:27.990
>> Sie haben sie.

00:09:27.990 --> 00:09:29.520
>> Warum glauben Sie, dass wir beides brauchen?

00:09:29.520 --> 00:09:32.985
>> Nun, sie machen verschiedene Dinge.

00:09:32.985 --> 00:09:36.090
>> ja. Tatsächlich
aufgrund dieses Bildes.

00:09:36.090 --> 00:09:38.025
merken. Ich habe darüber gesprochen.

00:09:38.025 --> 00:09:41.565
Sie können tatsächlich wissen,
über ihren eigenen Teil.

00:09:41.565 --> 00:09:44.190
Xamarin Profiler weiß also nichts

00:09:44.190 --> 00:09:47.100
über die Speicher native
Objekte, die dort erstellt wurden,

00:09:47.100 --> 00:09:50.010
und native Instrumente nicht
über verwalteten Speicher bescheid.

00:09:50.010 --> 00:09:52.685
Es sagt nur, es gibt einige
Teil des erstellten Objekts.

00:09:52.685 --> 00:09:54.710
Wenn Mono ein Objekt erstellt,

00:09:54.710 --> 00:09:57.275
es bindet es immer noch irgendwie
auf systemeigene Objekte.

00:09:57.275 --> 00:09:59.210
So werden Sie in der Lage sein zu sehen,

00:09:59.210 --> 00:10:00.500
aber alles andere wird es nicht sein.

00:10:00.500 --> 00:10:01.220
>> Okay. Cool.

00:10:01.220 --> 00:10:02.945
>> Sehen wir uns also den Xamarin Profiler an.

00:10:02.945 --> 00:10:06.550
Es ist leichter zu verstehen,
am Anfang,

00:10:06.550 --> 00:10:10.955
und es zeigt Ihnen auch schön
Namespace und wie Namensgebung.

00:10:10.955 --> 00:10:12.815
So können Sie Ihr Objekt identifizieren.

00:10:12.815 --> 00:10:16.715
Es gibt einen kleinen Button "Run"
und "Start Profil" hier.

00:10:16.715 --> 00:10:20.050
Sie benötigen ein Unternehmen
Lizenz, dies zu tun.

00:10:20.050 --> 00:10:23.870
Aber es ist sehr bequem und
Ich ermutige Sie, dies zu tun.

00:10:23.870 --> 00:10:25.190
Sobald Sie das tun,

00:10:25.190 --> 00:10:26.825
es baut tatsächlich die App mit

00:10:26.825 --> 00:10:31.130
einige zusätzliche Metadaten und
Code, der in Ihre App eingebettet ist.

00:10:31.130 --> 00:10:33.580
So konnten wir sehen und
die Objekte nachzuverfolgen.

00:10:33.580 --> 00:10:36.140
>> Jetzt eine Sache, während diese
baut und setzt, ist,

00:10:36.140 --> 00:10:38.030
wir laufen auf einem
Simulator, was bedeutet, dass es

00:10:38.030 --> 00:10:40.520
hat die volle PS davon.

00:10:40.520 --> 00:10:45.320
Ist es okay, dass ich es tue
und Profilierung auf meinem Gerät,

00:10:45.320 --> 00:10:49.150
oder ist es besser, es auf einem
physisches iPhone zum Beispiel?

00:10:49.150 --> 00:10:50.570
>> Das ist eine gute Frage, weil Sie

00:10:50.570 --> 00:10:52.340
können verschiedene Arten von Profiling.

00:10:52.340 --> 00:10:52.940
>> Interessant.

00:10:52.940 --> 00:10:54.230
>> Wenn Sie CPU profilieren,

00:10:54.230 --> 00:10:56.480
es ist keine gute Idee
um es auf Simulator zu tun

00:10:56.480 --> 00:10:58.820
weil Sie nicht die
volle Leistung des Geräts.

00:10:58.820 --> 00:11:01.340
Aber wenn Sie eine Erinnerung
Profiler und Zuordnung,

00:11:01.340 --> 00:11:04.355
Sie werden die gleichen Probleme bekommen
am Simulator und auf dem Gerät.

00:11:04.355 --> 00:11:04.730
>> Perfekt.

00:11:04.730 --> 00:11:10.300
>> Ich mache es gerne auf dem Laptop
weil es einfach schneller beginnt.

00:11:10.300 --> 00:11:13.010
Es übersetzt den Code nicht

00:11:13.010 --> 00:11:16.085
in native Anweisungen und einfach
simuliert und läuft sofort.

00:11:16.085 --> 00:11:18.470
Also, wenn Sie Speicher-Profiling tun,

00:11:18.470 --> 00:11:20.180
wenn Sie Apps so oft ausführen,

00:11:20.180 --> 00:11:23.045
also werden Sie es mögen.

00:11:23.045 --> 00:11:25.085
Lassen Sie mich den gleichen Test machen.

00:11:25.085 --> 00:11:27.980
Also habe ich die Detailseite einmal geöffnet,

00:11:27.980 --> 00:11:29.840
und Sie sehen diesen kleinen Gipfel hier.

00:11:29.840 --> 00:11:33.590
Das bedeutet, dass wir unsere
Speichernutzung erheblich.

00:11:33.590 --> 00:11:35.915
Aber das sieht man nicht
Speicherzunahme hier.

00:11:35.915 --> 00:11:38.510
Es ist immer noch wie das größte Objekt ist

00:11:38.510 --> 00:11:40.730
Systembaum und irgendwo hier.

00:11:40.730 --> 00:11:43.155
Lassen Sie mich es noch ein paar Mal tun.

00:11:43.155 --> 00:11:45.815
Ich werde es noch einmal erhöhen.

00:11:45.815 --> 00:11:47.610
Sie werden die Spitze hier sehen,

00:11:47.610 --> 00:11:49.735
aber Sie sehen hier keine Spitzen.

00:11:49.735 --> 00:11:53.330
Das bedeutet, dass wir bei der Zuweisung
in etwas im nativen Gedächtnis,

00:11:53.330 --> 00:11:56.220
es spiegelt nicht wider
es in der verwalteten Welt,

00:11:56.220 --> 00:11:59.419
aber wir sehen, dass der gesamte Speicher
wachsen und nicht umziehen,

00:11:59.419 --> 00:12:00.720
das ist das Wichtigste.

00:12:00.720 --> 00:12:01.455
>> Ich sehe.

00:12:01.455 --> 00:12:04.015
>> Wir kommen mit diesem Schnappschuss zurück.

00:12:04.015 --> 00:12:05.710
Speicher-Snapshot wird tatsächlich ausgeführt

00:12:05.710 --> 00:12:07.875
die Garbage Collection
auf der verwalteten Website.

00:12:07.875 --> 00:12:10.195
Also machen wir diese Momentaufnahme.
Ich werde noch einen machen.

00:12:10.195 --> 00:12:11.755
Ich werde es später erklären,

00:12:11.755 --> 00:12:14.500
, um den Abschluss-Cue zu behandeln.

00:12:14.500 --> 00:12:17.475
Aber im Grunde, jetzt ist es saubere Smemory.

00:12:17.475 --> 00:12:19.605
Wir stellen sicher, dass
unser Müllsammler

00:12:19.605 --> 00:12:22.270
bereits ausgeführt und deallocated
das gesamte erworbene Objekt.

00:12:22.270 --> 00:12:23.920
Wir sehen die Erinnerungen dort immer noch.

00:12:23.920 --> 00:12:25.845
Es ging also immer noch runter.

00:12:25.845 --> 00:12:28.755
Um zu wissen, was hier vor sich geht,

00:12:28.755 --> 00:12:32.005
wir gehen einfach hierher und
verwenden Sie die Filtertaste.

00:12:32.005 --> 00:12:35.265
Wir versuchen,
nur R-Objekte,

00:12:35.265 --> 00:12:38.110
und ich möchte auch auf
die Live-Objekte hier.

00:12:38.110 --> 00:12:40.980
Also habe ich dieses "Apply" getroffen
Taste und voila,

00:12:40.980 --> 00:12:43.575
wir sehen zwei Details Controller
hängen dim Gedächtnis,

00:12:43.575 --> 00:12:47.160
auch wenn ich nicht
Details an Ort und Stelle haben.

00:12:47.160 --> 00:12:48.570
>> Super Probe, so sagten Sie,

00:12:48.570 --> 00:12:50.289
alles in meinem Namensraum zu finden,

00:12:50.289 --> 00:12:51.610
filtern Sie darauf.

00:12:51.610 --> 00:12:54.820
Buchstäblich, was wir hier sehen
ist Detail View Controller 2.

00:12:54.820 --> 00:12:55.225
>> ja.

00:12:55.225 --> 00:12:56.650
>> Aber es sollte weg sein.

00:12:56.650 --> 00:13:00.015
>> Ich beginne mit dem größten
Objekte, die Sie auf diesen Seiten haben.

00:13:00.015 --> 00:13:00.280
>> ja.

00:13:00.280 --> 00:13:02.865
>> Das gilt auch für Android.

00:13:02.865 --> 00:13:04.030
Sie suchen einfach nach Aktivitäten,

00:13:04.030 --> 00:13:05.395
Modelle anzeigen oder was auch immer,

00:13:05.395 --> 00:13:07.875
denn sobald Sie eine Ansicht haben,
Modell, das dort hängt,

00:13:07.875 --> 00:13:11.320
es beginnt, alle
die anderen Objekte.

00:13:11.320 --> 00:13:13.380
Alle Dienstleistungen, alle Bindungen,

00:13:13.380 --> 00:13:16.605
alle UIs, und Sie werden
viel Speicher.

00:13:16.605 --> 00:13:17.500
>> Haben Sie es.

00:13:17.500 --> 00:13:19.465
>> Lassen Sie mich zeigen, dass es wahr ist.

00:13:19.465 --> 00:13:23.260
Ich werde es noch eine öffnen
Zeit, drücken Sie die "Snapshot".

00:13:23.260 --> 00:13:25.455
Wir sehen hier drei Instanzen.

00:13:25.455 --> 00:13:28.569
Ich gehe zurück und treffe "Snapshot",

00:13:28.569 --> 00:13:30.030
und es bleibt im Gedächtnis.

00:13:30.030 --> 00:13:30.660
>> Sie haben sie.

00:13:30.660 --> 00:13:32.500
>> Lassen Sie uns dieses Speicherproblem beheben.

00:13:32.500 --> 00:13:33.700
>> Ich bin bereit.

00:13:33.700 --> 00:13:36.470
>> Wie würden Sie das beheben?

00:13:41.220 --> 00:13:43.525
Dies ist eine Detailseite,

00:13:43.525 --> 00:13:45.460
also müssen wir uns abmelden
bei einer Veranstaltung.

00:13:45.460 --> 00:13:49.325
>> Sie haben sie. Das eigentliche Problem hier
ist, dass ich ein Ereignis abonniert habe.

00:13:49.325 --> 00:13:49.970
>> Ja.

00:13:49.970 --> 00:13:52.135
>> Dann sollten wir uns abmelden, oder?

00:13:52.135 --> 00:13:54.550
>> Das ist richtig. das
ist eine gute Praxis.

00:13:54.550 --> 00:13:56.370
Wann immer Sie dieses Plus gleich sehen,

00:13:56.370 --> 00:13:59.490
Sie suchen nur, wenn
es gibt ein Minus gleich,

00:13:59.490 --> 00:14:01.980
wenn nicht, du
sollte dies einführen.

00:14:01.980 --> 00:14:02.595
>> Haben Sie es.

00:14:02.595 --> 00:14:05.020
>> Dies ist eine erste Indikation
dass Sie einen Speicherverlust haben.

00:14:05.020 --> 00:14:05.340
>> Haben Sie es.

00:14:05.340 --> 00:14:10.460
>> Die einzige Ausnahme ist, wenn
Sie auf der Hauptseite abonnieren,

00:14:10.460 --> 00:14:12.285
wie unsere Hauptseite hier,

00:14:12.285 --> 00:14:14.725
und Sie sind sicher, dass diese Seite

00:14:14.725 --> 00:14:18.010
wird nicht gehen können
bald weg.

00:14:18.010 --> 00:14:20.115
>> Vielleicht haben Sie es bei
Ihre App Delegate-Ebenen.

00:14:20.115 --> 00:14:21.530
Du bist wie, ich tatsächlich
wollen, dass dies

00:14:21.530 --> 00:14:23.290
ein globales Ereignis für alle Zeiten.

00:14:23.290 --> 00:14:25.845
Aber vielleicht auch, wenn Ihre App
geht in den Hintergrund,

00:14:25.845 --> 00:14:27.295
Sie sollten sich auch abmelden.

00:14:27.295 --> 00:14:28.345
>> Das stimmt.

00:14:28.345 --> 00:14:28.675
>> ja.

00:14:28.675 --> 00:14:29.700
>> Nicht auszuführen.

00:14:29.700 --> 00:14:31.750
>> Also sagen Sie jetzt
wenn es erscheint,

00:14:31.750 --> 00:14:33.855
es wird abonnieren und verschwinden,

00:14:33.855 --> 00:14:35.935
abmelden, und dann
entfernen Sie die oben nach oben.

00:14:35.935 --> 00:14:37.990
>> Ja, ich habe mich aus der Cloud entfernt,

00:14:37.990 --> 00:14:39.710
weil wir
jedes Mal ausführen, wenn wir

00:14:39.710 --> 00:14:42.040
erscheinen und jedes Mal, wenn wir verschwinden.

00:14:42.040 --> 00:14:43.850
Plus gleich abonnieren,

00:14:43.850 --> 00:14:45.640
minus gleich abmelden.

00:14:45.640 --> 00:14:48.735
Nichts Kompliziertes, nur wollen

00:14:48.735 --> 00:14:52.045
stellen Sie sicher, dass wir keine
Instrumente, sobald Sie es durchgehen.

00:14:52.045 --> 00:14:52.720
>> Cool.

00:14:52.720 --> 00:14:55.110
>> Also mache ich das gleiche Zeug,

00:14:55.110 --> 00:14:59.490
gehen zu Details,
dass es wahr ist.

00:14:59.490 --> 00:15:02.980
Schnappschuss machen,
Filter in meine Events.

00:15:02.980 --> 00:15:05.300
Tut mir Leid. Es hat einfach geklickt.

00:15:08.700 --> 00:15:12.170
Sehen wir uns die Live-Objekte an.

00:15:12.420 --> 00:15:15.345
Wir sollten die Details sehen
weil wir gerade auf

00:15:15.345 --> 00:15:17.475
Detailseite. Wir gehen zurück.

00:15:17.475 --> 00:15:18.990
Wir haben einen "Snapshot" getroffen

00:15:18.990 --> 00:15:20.880
und was erwarten wir hier?

00:15:20.880 --> 00:15:23.715
Erstens: Müllabfuhr tatsächlich

00:15:23.715 --> 00:15:26.065
diese Objekte in
Abschluss-Cue,

00:15:26.065 --> 00:15:27.625
aber zweitens sollte Cue 1,

00:15:27.625 --> 00:15:30.340
oder wahrscheinlich immer noch die gleiche.

00:15:30.340 --> 00:15:31.570
>> Jetzt ist es weg.

00:15:31.570 --> 00:15:33.910
>> Ja. Lassen Sie mich also über

00:15:33.910 --> 00:15:36.940
Abschluss-Cue in einem
zweitens, aber vorerst,

00:15:36.940 --> 00:15:40.395
die Idee ist, dass wir
unsere Detailansicht verloren,

00:15:40.395 --> 00:15:43.135
und unsere Speichernutzung kommt zurück.

00:15:43.135 --> 00:15:43.770
>> Schön.

00:15:43.770 --> 00:15:46.150
>> So beheben wir Speicherverluste.

00:15:46.150 --> 00:15:49.420
>> ja. Sie haben Ihre
Ereignisse. Abmelden von Ereignissen.

00:15:49.420 --> 00:15:51.630
>> Faustregel.

00:15:51.630 --> 00:15:54.915
>> Das ist auch wirklich lustig
weil eines, es verursacht zwei Probleme.

00:15:54.915 --> 00:15:56.800
Wir haben gesehen, dass sie am Leben gehalten haben

00:15:56.800 --> 00:15:58.750
weil diese Ereignisse weitergehen.

00:15:58.750 --> 00:16:00.715
Jetzt feuern Sie also
sie mehrmals,

00:16:00.715 --> 00:16:04.290
aber auch, alles auf dieser Seite
wird im Gedächtnis bleiben.

00:16:04.290 --> 00:16:06.685
>> Das stimmt. Deshalb
wir haben ein schweres Bild hinzugefügt,

00:16:06.685 --> 00:16:08.205
und es ist immer noch im Gedächtnis.

00:16:08.205 --> 00:16:08.830
>> Haben Sie es.

00:16:08.830 --> 00:16:10.570
>> Lassen Sie mich Ihnen Instrumente zeigen.

00:16:10.570 --> 00:16:13.390
Also werde ich
unser Speicherleck zurück.

00:16:13.390 --> 00:16:13.800
>> Sicher.

00:16:13.800 --> 00:16:15.985
>> Entfernen Sie einfach das nicht abbestellende Ereignis.

00:16:15.985 --> 00:16:18.435
Ich werde in meinem Simulator bereitstellen,

00:16:18.435 --> 00:16:21.330
und Instrumente funktioniert ziemlich einfach.

00:16:21.330 --> 00:16:23.355
Sie wählen einfach das Ziel aus

00:16:23.355 --> 00:16:25.930
den Simulator und die
App, und das ist es.

00:16:25.930 --> 00:16:28.435
Das ist alles, was Sie brauchen, um zu beginnen
der Instruments-Profiler.

00:16:28.435 --> 00:16:30.175
Auch wenn es Xamarin App ist,

00:16:30.175 --> 00:16:32.150
Sie können es richtig starten
von den Instrumenten,

00:16:32.150 --> 00:16:33.615
die nichts über Xamarin weiß.

00:16:33.615 --> 00:16:35.310
>> Woher kommen Instrumente?

00:16:35.310 --> 00:16:38.709
>> Apple. Es ist ein Apple
Werkzeug, kommt mit Xcode,

00:16:38.709 --> 00:16:41.950
und es hat eine Menge von
Werkzeuge darin.

00:16:41.950 --> 00:16:43.450
>> So ist es nur eingebaut
weil Sie bereits

00:16:43.450 --> 00:16:45.415
Xcode installiert? Also
jeder hat das?

00:16:45.415 --> 00:16:46.015
>> Es ist kostenlos.

00:16:46.015 --> 00:16:48.925
>> Es ist kostenlos. Cool. Also jeder
können Sie dies jetzt jetzt nutzen?

00:16:48.925 --> 00:16:53.880
>> Ja. Sie können tatsächlich
diese Aktivitäten zu sehen,

00:16:53.880 --> 00:16:57.920
auch wenn die von Managed
Welt wie Details Aktivität,

00:16:57.920 --> 00:17:00.525
es ist immer noch vertreten
durch ein natives Objekt.

00:17:00.525 --> 00:17:00.930
>> Haben Sie es.

00:17:00.930 --> 00:17:02.855
>> Suchen wir also nach diesem Objekt.

00:17:02.855 --> 00:17:07.240
Wir nennen es Details View Controller.

00:17:07.240 --> 00:17:09.595
Lassen Sie mich einige davon erstellen.

00:17:09.595 --> 00:17:11.030
>> Das ist tatsächlich
wirklich cool, weil

00:17:11.030 --> 00:17:12.240
Ich habe noch nie Instrumente verwendet,

00:17:12.240 --> 00:17:15.295
sagen Sie es niemandem, in Jahren.

00:17:15.295 --> 00:17:18.440
Ich glaube nicht, dass jeder gibt
mir ein Detail. Es gibt sie also?

00:17:18.440 --> 00:17:20.070
>> Ja, es gibt sie.

00:17:20.070 --> 00:17:22.335
>> Das macht Sinn
weil Xamarin muttersprachisch ist,

00:17:22.335 --> 00:17:23.770
so wird ein systemeigenes Objekt erstellt.

00:17:23.770 --> 00:17:26.380
>> Ja. Sie müssen nicht tun

00:17:26.380 --> 00:17:27.885
eine Speicher-Snapshot hier

00:17:27.885 --> 00:17:29.975
weil wir keine
Garbage Collection hier.

00:17:29.975 --> 00:17:33.780
IOS verwendet Hierarchie, die
automatischer Referenzzähler.

00:17:33.780 --> 00:17:35.605
Grundsätzlich ist es immer, wann immer
Sie ein Objekt erstellen,

00:17:35.605 --> 00:17:37.065
es erhöht den Zähler,

00:17:37.065 --> 00:17:39.550
wann immer Sie nicht verwenden oder es

00:17:39.550 --> 00:17:42.505
geht weg vom Anwendungsbereich der
Nutzung wird der Zähler dekrementiert.

00:17:42.505 --> 00:17:43.845
Sobald der Zähler Null ist,

00:17:43.845 --> 00:17:46.495
Das Objekt ist Müll und
es konnte gesammelt werden.

00:17:46.495 --> 00:17:48.075
So ist es ziemlich einfach zu starten

00:17:48.075 --> 00:17:51.735
die Instrumente mit der App
einfach durch Klicken auf diese Schaltfläche.

00:17:51.735 --> 00:17:53.505
Es startet die App,

00:17:53.505 --> 00:17:55.860
Es zeigt Ihnen die Speichernutzung hier.

00:17:55.860 --> 00:17:57.690
Öffnen wir die Seite Details.

00:17:57.690 --> 00:18:00.425
>> Sie haben sie. Instrumente
kommt von Apple?

00:18:00.425 --> 00:18:02.040
>> Instrumente kommen von Apple.

00:18:02.040 --> 00:18:03.350
Es ist ein kostenloses Tool von Apple.

00:18:03.350 --> 00:18:04.490
Sie können dies jetzt verwenden.

00:18:04.490 --> 00:18:05.390
>> Cool.

00:18:05.390 --> 00:18:06.970
>> Sie sehen, wir haben auch

00:18:06.970 --> 00:18:10.140
dieser Speicher-Footprint richtig
hier, sobald wir Details Seite öffnen.

00:18:10.140 --> 00:18:12.120
Öffnen wir es noch einmal.

00:18:12.120 --> 00:18:15.140
>> Das ist also sehr ähnlich
zum Xamarin-Profiler,

00:18:15.140 --> 00:18:16.870
aber das wird uns zeigen

00:18:16.870 --> 00:18:19.240
der native Stack für alle
Absichten und Zwecke.

00:18:19.240 --> 00:18:21.500
>> Das stimmt. Leider ist es

00:18:21.500 --> 00:18:24.090
weiß nichts über
Xamarin und verwaltete Welt,

00:18:24.090 --> 00:18:27.025
so können Sie nicht sehen,
das verwaltete Objekt, das es erstellt hat.

00:18:27.025 --> 00:18:28.990
So siehst du die Spitze,

00:18:28.990 --> 00:18:30.850
und du siehst, dass es nicht weggeht.

00:18:30.850 --> 00:18:33.350
Lassen Sie mich es also ein drittes Mal tun,

00:18:33.350 --> 00:18:35.145
und zeigen Sie einfach die Objekte.

00:18:35.145 --> 00:18:38.455
Mal sehen. Es gibt
eine kleine Filtertaste.

00:18:38.455 --> 00:18:43.170
Wir gehen zu allen Zuweisungen hier,

00:18:43.170 --> 00:18:45.165
und drücken Sie die "Details".

00:18:45.165 --> 00:18:45.820
>> Okay.

00:18:45.820 --> 00:18:47.555
>> Das sind drei Seiten hier,

00:18:47.555 --> 00:18:48.660
sie sind alle im Gedächtnis,

00:18:48.660 --> 00:18:50.650
und sie im Speicher zuordnen.

00:18:50.650 --> 00:18:54.070
Ich werde nicht zeigen, wie wir die Zuordnung
es, weil es die gleiche Lösung ist,

00:18:54.070 --> 00:18:57.020
wir einfach abbestellen,
verwaltete Welt abmeldet sich ab

00:18:57.020 --> 00:19:00.120
aus dem Objekt. Objekt
als Müll betrachtet.

00:19:00.120 --> 00:19:04.660
Dann unser Müllsammler
sammelt diese Informationen,

00:19:04.660 --> 00:19:06.460
dann native kann sammeln
weil nichts

00:19:06.460 --> 00:19:08.490
von der Manage-Welt
daran festhalten.

00:19:08.490 --> 00:19:10.780
>> Macht Sinn. So sehr sehr
ähnlich fix,

00:19:10.780 --> 00:19:12.255
aber eine andere Möglichkeit, es zu erkennen.

00:19:12.255 --> 00:19:15.045
>> Das stimmt. Das ist also

00:19:15.045 --> 00:19:19.345
über Unterschiede zwischen
verwaltete und einheimische Welt.

00:19:19.345 --> 00:19:22.120
Meine nächsten Beispiele werden
meistens über verwaltete

00:19:22.120 --> 00:19:25.320
Welt, weil Sie
Problem in jedem,

00:19:25.320 --> 00:19:26.905
und es ist nicht mit Xamarin verwandt.

00:19:26.905 --> 00:19:29.570
Wie Sie sagten, könnte es
Abonnieren eines statischen Ereignisses,

00:19:29.570 --> 00:19:32.745
es könnte einführen
Problem auch überall.

00:19:32.745 --> 00:19:35.410
Das nächste ist also

00:19:35.410 --> 00:19:38.210
über Abonnement und
ohne Abmeldungen.

00:19:38.210 --> 00:19:39.315
Aber in diesem Fall

00:19:39.315 --> 00:19:42.820
wir sind tatsächlich
implizit abonnieren,

00:19:42.820 --> 00:19:44.480
wir verwenden keine Plus-Equals.

00:19:44.480 --> 00:19:46.015
Es ist also schwieriger zu finden.

00:19:46.015 --> 00:19:48.710
In diesem Fall führen wir diese
Benachrichtigungscenter versucht,

00:19:48.710 --> 00:19:51.795
identifizieren, wenn unsere App gedreht wird.

00:19:51.795 --> 00:19:53.695
Wir fügen diesen Beobachter hinzu.

00:19:53.695 --> 00:19:57.525
Dies ist ein Singleton-Standardcenter.

00:19:57.525 --> 00:19:59.700
Wir sagen das, ich will

00:19:59.700 --> 00:20:02.595
Informationen, wann immer
Orientierung geändert,

00:20:02.595 --> 00:20:04.140
und hier ist mein Handler dafür.

00:20:04.140 --> 00:20:04.650
>> Haben Sie es.

00:20:04.650 --> 00:20:06.690
>> Der Handler selbst,
es ist ziemlich einfach.

00:20:06.690 --> 00:20:08.125
Wir werden dort nichts tun,

00:20:08.125 --> 00:20:11.665
wir drucken es einfach zum Debuggen.

00:20:11.665 --> 00:20:12.465
>> Haben Sie es.

00:20:12.465 --> 00:20:15.525
>> Lassen Sie mich die
Konnektivitäts-Sachen, weil

00:20:15.525 --> 00:20:18.630
wollen wir verschiedene
Arten von Speicherproblemen.

00:20:18.630 --> 00:20:21.525
Ich kommend auch zu unserem
Bild, weil wir nicht brauchen

00:20:21.525 --> 00:20:24.430
, um den Speicher anzuzeigen
Fußabdruck, es ist da.

00:20:24.430 --> 00:20:28.390
Wir experimentieren nur mit
UI-Ansichtscontroller und Ansichten.

00:20:28.390 --> 00:20:30.650
>> Sehr cool. So ist dies
ist sehr ähnlich,

00:20:30.650 --> 00:20:32.870
aber dieses Muster, Sie
könnte abonnieren,

00:20:32.870 --> 00:20:34.605
vielleicht sogar in einer Aktion vorbei.

00:20:34.605 --> 00:20:38.340
Oder in diesem Fall, was es tut
es sagt hier ist Ihr Rückruf.

00:20:38.340 --> 00:20:40.010
Die Delegierten sind sich sehr ähnlich,

00:20:40.010 --> 00:20:41.115
Ich denke an diese Muster.

00:20:41.115 --> 00:20:42.480
Es ist also nur etwas
Ich bin es auch gewohnt.

00:20:42.480 --> 00:20:45.590
>> Das stimmt. Das war

00:20:45.590 --> 00:20:47.864
ihre Hauptidee, weil
wenn Sie abonnieren,

00:20:47.864 --> 00:20:51.405
Sie den Verweis an
ui View Controller.

00:20:51.405 --> 00:20:53.425
Das ist einfach eine andere
Weg, um den Verweis zu übergeben.

00:20:53.425 --> 00:20:55.260
Das ist manchmal nicht so offensichtlich.

00:20:55.260 --> 00:20:57.955
So haben wir unser Abonnement,
es läuft hier.

00:20:57.955 --> 00:20:59.305
Es läuft nur einmal.

00:20:59.305 --> 00:21:01.780
Schließen und öffnen wir es wieder.

00:21:01.780 --> 00:21:03.525
Jetzt haben wir einen Doppelklick.

00:21:03.525 --> 00:21:05.230
Lassen Sie mich dies deutlich machen.

00:21:05.230 --> 00:21:07.240
Einmal rotieren, zwei bekommen,

00:21:07.240 --> 00:21:11.655
Was bedeutet, dass wir einige UI-Ansicht haben
Controller im Speicher hängen,

00:21:11.655 --> 00:21:13.535
während der Verarbeitung des ersten.

00:21:13.535 --> 00:21:13.980
>> Haben Sie es.

00:21:13.980 --> 00:21:15.430
>> Es könnte ein Problem sein, wenn Sie

00:21:15.430 --> 00:21:19.660
Einige Datenbankaktualisierungslogik
oder HTTP-Anforderung Überstunden.

00:21:19.660 --> 00:21:21.340
Wie an einem Tag der Nutzung,

00:21:21.340 --> 00:21:24.810
Ihre App wird nicht getötet, Sie
deaktivieren, reaktivieren.

00:21:24.810 --> 00:21:26.740
Es wird all dies
Ansicht noch im Speicher,

00:21:26.740 --> 00:21:28.265
und in einer Woche könnte es abstürzen.

00:21:28.265 --> 00:21:28.785
>> ja.

00:21:28.785 --> 00:21:30.105
>> Wie kann man das beheben?

00:21:30.105 --> 00:21:31.550
Es ist sehr einfach.

00:21:31.550 --> 00:21:34.145
>> Ich gehe davon aus, dass Sie sich abmelden?

00:21:34.145 --> 00:21:35.835
>> Das stimmt. Das ist schwieriger,

00:21:35.835 --> 00:21:38.685
abmelden, weil Sie
haben nicht plus gleich.

00:21:38.685 --> 00:21:42.010
Lassen Sie mich auch zeigen, was Sie
tatsächlich hier einsenden.

00:21:42.010 --> 00:21:43.365
Wenn Sie also abonnieren,

00:21:43.365 --> 00:21:46.395
Sie übergeben den Methodennamen.

00:21:46.395 --> 00:21:48.215
Sie übergeben tatsächlich eine Aktion,

00:21:48.215 --> 00:21:51.745
und Compiler macht eine
große Aufgabe, das zu verbergen,

00:21:51.745 --> 00:21:54.150
und unser Leben zu erleichtern.

00:21:54.150 --> 00:21:55.945
>> Compiler ist sehr nett.

00:21:55.945 --> 00:21:57.255
>> Sehr schön zu uns.

00:21:57.255 --> 00:22:00.415
Deshalb sind wir gerne Entwickler.

00:22:00.415 --> 00:22:04.360
Also fragt es tatsächlich nach
Aktion mit NSNotification.

00:22:04.360 --> 00:22:07.840
Also unterschreibe ich NSNotification hier,

00:22:07.840 --> 00:22:13.365
und dann mit dieser Notation,
Dieses Objekt einfügen.

00:22:13.365 --> 00:22:16.560
Anstelle des Methodennamens

00:22:16.560 --> 00:22:19.225
wir sind tatsächlich vorbei
eine Aktion und ein Objekt,

00:22:19.225 --> 00:22:20.960
die den Verweis auf

00:22:20.960 --> 00:22:23.610
diese Metadaten darüber, wie
, um die Methode aufzurufen.

00:22:23.610 --> 00:22:26.555
Wir geben also die Methode nicht weiter,
es ist nur eine Referenz.

00:22:26.555 --> 00:22:30.060
In unserem Fall sind die wichtigsten
Teil, wenn diese Referenz übergeben wird,

00:22:30.060 --> 00:22:32.155
das ist UIV-Controller,

00:22:32.155 --> 00:22:34.170
und das ist der Grund, warum es in Erinnerung gehalten wird.

00:22:34.170 --> 00:22:35.260
>> Haben Sie es.

00:22:35.260 --> 00:22:35.865
>> Okay.

00:22:35.865 --> 00:22:36.670
>> Macht Sinn. Ja.

00:22:36.670 --> 00:22:38.595
>> Ich zeige keine Details

00:22:38.595 --> 00:22:40.390
da der Speicher
Leck ist immer noch da

00:22:40.390 --> 00:22:43.975
weil wir diese
etwas Zeit zu sparen.

00:22:43.975 --> 00:22:45.500
Ich möchte mich auf

00:22:45.500 --> 00:22:48.830
das Worst-Case-Szenario, das
Sie sollten sich dessen bewusst sein.

00:22:48.830 --> 00:22:54.250
Wenn die heimische Welt nicht
schön mit der verwalteten Welt.

00:22:54.250 --> 00:22:56.280
>> Sie haben sie. Wenn die
zwei Welten kollidieren.

00:22:56.280 --> 00:23:00.265
>> Das ist richtig, denn wann immer
wir haben ein Objekt erstellt,

00:23:00.265 --> 00:23:02.155
und es wird ein natives Objekt erstellt,

00:23:02.155 --> 00:23:05.690
und er/sie versucht,
Deallocate native Objekte,

00:23:05.690 --> 00:23:07.495
unsere verwaltete Welt denkt,

00:23:07.495 --> 00:23:09.330
Ich bin immer noch nicht mit diesem Objekt fertig.

00:23:09.330 --> 00:23:11.270
Bitte halten Sie an, nicht

00:23:11.270 --> 00:23:13.765
das Objekt sammeln, weil
Ich arbeite immer noch damit.

00:23:13.765 --> 00:23:14.525
>> Sie haben sie.

00:23:14.525 --> 00:23:15.805
>> Es könnte gegensätzlich sein,

00:23:15.805 --> 00:23:19.130
wenn eine einheimische Welt
könnte ein Objekt erstellen,

00:23:19.130 --> 00:23:20.265
und jetzt denkt eine verwaltete Welt,

00:23:20.265 --> 00:23:22.450
es ist nicht getan, immer noch
dort, also lassen Sie uns halten.

00:23:22.450 --> 00:23:25.015
Auch wenn Sie keine anderen
Verweise auf dieses Objekt,

00:23:25.015 --> 00:23:29.015
es halten könnte, könnte es
halten Sie es nicht als Müll.

00:23:29.015 --> 00:23:29.820
>> Sie haben sie.

00:23:29.820 --> 00:23:31.460
>> Ich könnte es mit

00:23:31.460 --> 00:23:34.640
dieses kleine kleine Bild
von unsterblicher Gegenstände.

00:23:34.640 --> 00:23:37.230
Also nicht unsterblich schaffen
Objekte. Die sind schlecht.

00:23:37.230 --> 00:23:38.435
>> Es klingt cool.

00:23:38.435 --> 00:23:39.963
>> ja.

00:23:39.963 --> 00:23:43.355
Es geschieht, wenn Sie
haben diese beiden Welten.

00:23:43.355 --> 00:23:46.925
Native, sehen Sie auf der rechten Seite die
native View Controller und Ansichten,

00:23:46.925 --> 00:23:49.640
und von links haben Sie

00:23:49.640 --> 00:23:52.580
verwaltete Welt C Sharp, die
Ansichtscontroller und Ansichten.

00:23:52.580 --> 00:23:55.640
Wann immer Sie nicht wissen, was
geschehen auf der einheimischen Welt,

00:23:55.640 --> 00:23:58.070
Sie können nicht sammeln
es von dieser Welt.

00:23:58.070 --> 00:24:00.905
Ich zeige Ihnen ein Beispiel
wie Sie das tun können.

00:24:00.905 --> 00:24:03.275
In meinem Beispiel

00:24:03.275 --> 00:24:07.235
Ich möchte hier eine kleine
kleine Taste "Speichern",

00:24:07.235 --> 00:24:11.375
und wollen nur die
Anzeigen, sobald der Benutzer darauf trifft.

00:24:11.375 --> 00:24:13.925
Nehmen wir an, dass die
"Save"-Taste funktioniert auch

00:24:13.925 --> 00:24:17.330
Einige Speicherlogikdatenbanken
oder HTTP-Aufrufe, was auch immer,

00:24:17.330 --> 00:24:19.055
es geht einfach nicht zurück

00:24:19.055 --> 00:24:22.145
und es führt tatsächlich
einige zusätzliche Maßnahmen.

00:24:22.145 --> 00:24:22.775
>> Okay.

00:24:22.775 --> 00:24:24.980
>> Als Details dieser Schaltfläche

00:24:24.980 --> 00:24:26.300
senden wir den Handler ein.

00:24:26.300 --> 00:24:31.205
Dieser Handler sagt, dass
Schließen Sie diese Controller.

00:24:31.205 --> 00:24:33.395
>> Sieht für mich völlig legitim aus.

00:24:33.395 --> 00:24:35.255
>> Ja. Wir stellen vor
speicherlecks.

00:24:35.255 --> 00:24:36.230
>> Okay.

00:24:36.230 --> 00:24:42.515
>> Du bist schlecht. Es wird leider
und es ist ein gemeinsames Muster.

00:24:42.515 --> 00:24:45.005
Wir haben keine
statisches Ereignis wie hier.

00:24:45.005 --> 00:24:47.195
Wir haben keine
einfarbiger Ton wie hier.

00:24:47.195 --> 00:24:49.025
Wir halten diese Taste hier,

00:24:49.025 --> 00:24:51.650
Dies ist nur ein lokales Element.

00:24:51.650 --> 00:24:54.260
Okay James, jetzt wir
erstellte eine Schaltfläche und

00:24:54.260 --> 00:24:56.735
wollen wir es hinzufügen, um
unsere Navigationsansicht.

00:24:56.735 --> 00:25:00.440
Also sagten wir darin durch die
Navigationselement wird auch nicht verwendet

00:25:00.440 --> 00:25:05.225
statische Verweise nichts
so und einfach so.

00:25:05.225 --> 00:25:08.015
Jetzt haben wir die Sub-Taste
und starten wir den Profiler.

00:25:08.015 --> 00:25:09.890
>> ja und wieder,
super ähnliches Muster.

00:25:09.890 --> 00:25:11.285
Ich erstelle eine Schaltfläche,

00:25:11.285 --> 00:25:15.800
fügen Sie eine Schaltfläche hinzu, und dann knalle ich die
View Controller scheint normal.

00:25:15.800 --> 00:25:18.185
>> Haben Sie einen Delegaten, der nicht verwendet

00:25:18.185 --> 00:25:20.540
externe oder statische Referenzen

00:25:20.540 --> 00:25:23.225
und übergibt keine Referenz
von unserem Controller.

00:25:23.225 --> 00:25:23.750
>> Sie haben sie.

00:25:23.750 --> 00:25:27.090
>> Sollte gut funktionieren,
Richting? Mal sehen.

00:25:27.280 --> 00:25:32.780
Profiler zeigt also die Objekte

00:25:32.780 --> 00:25:34.760
am Anfang erstellt und ich bin

00:25:34.760 --> 00:25:37.790
Gehen, um Tracking zu starten
ganz am Anfang.

00:25:37.790 --> 00:25:39.530
Also habe ich Schnappschüsse richtig versteckt

00:25:39.530 --> 00:25:42.455
und filtert nur auf meine Objekte.

00:25:42.455 --> 00:25:45.380
Wieder ist sehr häufig
Muster zur Fehlerbehebung

00:25:45.380 --> 00:25:48.800
Speicherprobleme nur
sehen Sie nur meine Objekte.

00:25:48.800 --> 00:25:52.235
Dann bin ich einmal weg.
Dies ist mein Button.

00:25:52.235 --> 00:25:55.565
Sehen Sie, dies ist ein neues Steuerelement
schön unsere Anwendung.

00:25:55.565 --> 00:25:56.870
Wir haben das im Gedächtnis,

00:25:56.870 --> 00:25:58.745
was wahr ist, das erwarten wir.

00:25:58.745 --> 00:26:03.410
Zurück, lasst uns einen treffen
mehr Zeit und noch einmal.

00:26:03.410 --> 00:26:04.430
>> Noch einmal, weil ich es weiß.

00:26:04.430 --> 00:26:05.195
>> Noch einmal.

00:26:05.195 --> 00:26:06.380
>> Okay, und immer noch da.

00:26:06.380 --> 00:26:08.270
>> Noch einmal ist es da.

00:26:08.270 --> 00:26:11.030
Also lassen Sie uns es öffnen und viel mehr Mal.

00:26:11.030 --> 00:26:14.090
Schließen wir es auch
anders zurück,

00:26:14.090 --> 00:26:17.390
gehen, um zu speichern, es ist tatsächlich
im Grunde das gleiche tun.

00:26:17.390 --> 00:26:20.090
Lassen Sie uns die "Memory
Schnappschuss" noch eins

00:26:20.090 --> 00:26:22.610
Zeit und oh wow wir
fünf Instanzen von

00:26:22.610 --> 00:26:24.920
Seiten, die dort hängen
Speicher und wenn Sie

00:26:24.920 --> 00:26:28.130
ein riesiges Bild gibt es
wird viel Speicher haben

00:26:28.130 --> 00:26:28.550
>> Haben Sie es.

00:26:28.550 --> 00:26:32.615
>> Das ist also ein sehr häufiges Muster

00:26:32.615 --> 00:26:36.800
weil es nicht offensichtlich ist, dass
Sie haben hier ein Speicherleck.

00:26:36.800 --> 00:26:39.830
Hier geht es um
dass UIBarButtonItem

00:26:39.830 --> 00:26:43.910
hält tatsächlich an
einige native Ressource,

00:26:43.910 --> 00:26:45.485
es ist an die systemeigene Ressource gebunden.

00:26:45.485 --> 00:26:49.100
Wenn wir das nicht klar sagen
Ich brauche diesen Knopf nicht mehr,

00:26:49.100 --> 00:26:51.020
sie möchten
dieses unsterbliche Objekt.

00:26:51.020 --> 00:26:53.135
>> Sie haben sie. Wie also
Ich löse dieses Ding?

00:26:53.135 --> 00:26:56.240
>> Um das zu lösen, verwenden wir

00:26:56.240 --> 00:26:59.900
unsere ViewDisappear-Veranstaltung und
etwas mit unserem Knopf zu tun.

00:26:59.900 --> 00:27:00.150
>> Okay.

00:27:00.150 --> 00:27:01.220
>> So haben wir zwei Möglichkeiten,

00:27:01.220 --> 00:27:02.735
wir könnten entweder

00:27:02.735 --> 00:27:05.299
Geklicktes Ereignis und
abonnieren und abbestellen,

00:27:05.299 --> 00:27:07.160
aber wir werden wieder

00:27:07.160 --> 00:27:10.400
unser erster Artikel, wenn wir abonnieren
ohne abzubestellen.

00:27:10.400 --> 00:27:12.560
Lassen Sie uns etwas Interessanteres tun.

00:27:12.560 --> 00:27:14.030
Wir entsorgen den Button einfach.

00:27:14.030 --> 00:27:15.680
>> Das gefällt mir. Ich bin
damit fertig, nicht wahr?

00:27:15.680 --> 00:27:18.320
>> Ja, wir sagen
verwaltete Welt, die,

00:27:18.320 --> 00:27:20.495
"Ich bin mit dem Knopf fertig
bitte entsorgen Sie es."

00:27:20.495 --> 00:27:24.365
Es ist nicht offensichtlich, weil
Viele Ansichten und Wrapper

00:27:24.365 --> 00:27:26.540
in Xamarin haben iOS
diese Dispose-Methode und

00:27:26.540 --> 00:27:29.015
Sie wissen nicht wirklich, wann immer
Sie sollten das nennen.

00:27:29.015 --> 00:27:30.815
Es ist also ein interessanter Fall.

00:27:30.815 --> 00:27:32.975
Aber lassen Sie uns das tun und lassen Sie uns laufen.

00:27:32.975 --> 00:27:34.700
Das ist die einzige Aktion, die ich hinzugefügt habe

00:27:34.700 --> 00:27:37.500
seit dem vorherigen Anwendungslauf.

00:27:38.290 --> 00:27:42.530
Ich starte den Profiler
und den gleichen Anwendungsfall zu tun.

00:27:42.530 --> 00:27:44.000
Wir werden die Objekte von

00:27:44.000 --> 00:27:46.310
den Anfang und machen
sicher, dass sie entsorgt werden.

00:27:46.310 --> 00:27:48.050
>> Sehr cool. Das ist schön.

00:27:48.050 --> 00:27:49.670
So hätten Sie, wie Sie sagten,

00:27:49.670 --> 00:27:53.270
anstatt vorbei
dass die gesamte Aktion in,

00:27:53.270 --> 00:27:55.130
Sie können genauso ähnlich wie wir

00:27:55.130 --> 00:27:57.605
tun Konnektivität,
abonnieren, abbestellen,

00:27:57.605 --> 00:28:00.590
Ich hätte es mir ausgetobt
aus, aber in diesem Fall,

00:28:00.590 --> 00:28:03.125
Du hast es schon getan, also
Sie einfach entsorgen.

00:28:03.125 --> 00:28:04.010
>> Das stimmt.

00:28:04.010 --> 00:28:04.875
>> Cool.

00:28:04.875 --> 00:28:08.455
>> ja, denn wir
erwarten, dass sie abgemeldet wird.

00:28:08.455 --> 00:28:10.840
Es ist keine Art von Abonnement,

00:28:10.840 --> 00:28:14.230
wir geben einfach vorbei und delegieren
innerhalb des lokalen Objekts.

00:28:14.230 --> 00:28:16.045
Im Falle von NotificationCenter

00:28:16.045 --> 00:28:18.790
es ist eine Art Abonnement, weil
wir geben das lokale Objekt ein

00:28:18.790 --> 00:28:21.760
in einige statische
Instanz oder Singleton.

00:28:21.760 --> 00:28:24.760
In diesem Fall haben wir nur
in unseren lokalen Ressourcen,

00:28:24.760 --> 00:28:26.395
wir erwarten kein Speicherleck.

00:28:26.395 --> 00:28:26.680
>> Sie haben sie.

00:28:26.680 --> 00:28:28.630
>> Aber leider kann ich sehen,

00:28:28.630 --> 00:28:32.660
diese Barriere viel und Menschen
in diese Situationen zu geraten.

00:28:32.680 --> 00:28:37.530
Also lassen Sie uns den gleichen Trick tun.

00:28:37.750 --> 00:28:41.760
Ich wünschte, es könnte diese Daten speichern.

00:28:41.950 --> 00:28:46.310
Wir haben also nur eine Ansicht
Controller und Delegat.

00:28:46.310 --> 00:28:48.290
Lassen Sie uns "Speichern" drücken.

00:28:48.290 --> 00:28:51.215
Gehen wir zurück.

00:28:51.215 --> 00:28:54.005
Bleiben wir tatsächlich auf der Detailseite.

00:28:54.005 --> 00:28:56.975
Klicken Sie auf "Memory snapshot" und wir sehen einen.

00:28:56.975 --> 00:28:59.315
Lassen Sie mich noch ein paar Mal darauf klicken.

00:28:59.315 --> 00:29:02.735
Wir werden darüber sprechen. Also haben wir
haben hier nur eine Instanz.

00:29:02.735 --> 00:29:10.805
Ich klicke auf "Speichern", klicke auf "Snapshot"
und es verschwindet Scan.

00:29:10.805 --> 00:29:12.380
Okay? Speicherleck behoben.

00:29:12.380 --> 00:29:13.250
>> Sehr cool. nett.

00:29:13.250 --> 00:29:14.900
>> Unsterbliches Objekt wurde getötet.

00:29:14.900 --> 00:29:16.445
>> Getötet. Sehr cool.

00:29:16.445 --> 00:29:17.810
Ansonsten ist das genial.

00:29:17.810 --> 00:29:20.600
So ganz einfach, schauen Sie sich Ihre Veranstaltungen an,

00:29:20.600 --> 00:29:22.850
aber auch schauen, wie Sie vorbei

00:29:22.850 --> 00:29:24.890
diese Aktionen rund um und sogar ich

00:29:24.890 --> 00:29:26.870
würde nicht einmal darüber nachdenken
Knopf, um ehrlich mit Ihnen zu sein

00:29:26.870 --> 00:29:29.315
da der Konstruktor
wird dieses Ding passieren.

00:29:29.315 --> 00:29:29.600
>> Ja.

00:29:29.600 --> 00:29:30.725
>> So sehr cool.

00:29:30.725 --> 00:29:33.350
>> Ich würde auch empfehlen,

00:29:33.350 --> 00:29:36.425
unsere Entwickler, um es mehr zu nutzen
oft einmal pro Woche zu mögen,

00:29:36.425 --> 00:29:39.545
jeden Sprint und dann
sehen Sie die Speichernutzung,

00:29:39.545 --> 00:29:41.585
Sie können es als UI-Testlauf sehen.

00:29:41.585 --> 00:29:45.590
Es zeigt diese kleine
Speicherarbeitssatz.

00:29:45.590 --> 00:29:48.050
So sehen Sie einfach vorbei
Monate, wenn es wächst oder

00:29:48.050 --> 00:29:51.530
nicht und wenn es wächst Sie
wahrscheinlich ein Speicherleck haben.

00:29:51.530 --> 00:29:53.360
>> Sie haben iOS gezeigt.

00:29:53.360 --> 00:29:54.560
Was ist nun mit Android?

00:29:54.560 --> 00:29:57.500
Gibt es spezifische andere
Tools, die Sie verwenden können?

00:29:57.500 --> 00:29:59.465
>> Es ist eine große Frage
weil, Android,

00:29:59.465 --> 00:30:02.000
alles, worüber wir gesprochen haben
iOS gilt für Android.

00:30:02.000 --> 00:30:02.150
>> Sie haben sie.

00:30:02.150 --> 00:30:03.440
>> Haben Sie einfach ein anderes Werkzeug für

00:30:03.440 --> 00:30:07.145
Native Android-Profiler
Android Profiler genannt.

00:30:07.145 --> 00:30:08.390
Es ist wirklich cool.

00:30:08.390 --> 00:30:09.740
Es zeigt Ihnen eine Menge

00:30:09.740 --> 00:30:12.380
Informationen, aber Sie haben noch
zu verwenden, wer

00:30:12.380 --> 00:30:14.330
Xamarin-Profiler in Verbindung mit

00:30:14.330 --> 00:30:16.790
aufgrund von verwalteten
Welt und heimatverbunden.

00:30:16.790 --> 00:30:17.930
>> Sie haben sie. Es ist einfach es

00:30:17.930 --> 00:30:19.340
klingt es cool, dass
es gibt großartige Tools

00:30:19.340 --> 00:30:22.400
verfügbar, egal wo
Sie sind bei, iOS, Android.

00:30:22.400 --> 00:30:23.240
>> Das ist richtig.

00:30:23.240 --> 00:30:24.005
>> Ich kann weitermachen und das tun.

00:30:24.005 --> 00:30:25.820
Ehrlich gesagt, nur suchen
bei einigen dieser,

00:30:25.820 --> 00:30:28.160
Ich bin mir ziemlich sicher, dass mein Code,
es gibt eine Menge schlechter Sachen.

00:30:28.160 --> 00:30:29.480
Wenn ich also als nächstes streame,

00:30:29.480 --> 00:30:31.790
es wird alles sein
meine Speicherverluste zu beheben.

00:30:31.790 --> 00:30:32.180
>> Okay.

00:30:32.180 --> 00:30:34.280
>> Sehr cool. Alles andere Alexi
über die Sie sprechen möchten?

00:30:34.280 --> 00:30:35.315
>> Das alles für heute.

00:30:35.315 --> 00:30:37.865
>> Ehrfürchtig. Nun, danke
jeder zum Einstimmen.

00:30:37.865 --> 00:30:40.010
Alexi, vielen Dank für
zeigt all diese Sachen.

00:30:40.010 --> 00:30:42.305
>> Danke Jungs. Danken
Du James, weil du mich lassst.

00:30:42.305 --> 00:30:43.970
>> Absolut, und stellen Sie sicher,

00:30:43.970 --> 00:30:45.920
dass Sie alle
die Show-Notizen unten,

00:30:45.920 --> 00:30:47.420
Öffnen Sie alle Quellen
Code, alle Links

00:30:47.420 --> 00:30:48.980
für die gesamte Dokumentation da unten.

00:30:48.980 --> 00:30:51.740
Sie können auch zu aka.ms/Xamarin

00:30:51.740 --> 00:30:54.485
Best Practices für die gesamte Serie.

00:30:54.485 --> 00:30:55.790
Stellen Sie also sicher, dass Sie

00:30:55.790 --> 00:30:57.695
heute, wo immer Sie sind
beobachten Sie jetzt.

00:30:57.695 --> 00:30:59.090
Ich bin James Montemagno.

00:30:59.090 --> 00:31:01.790
Das war der Xamarin
Zeigen und danke für das Zuschauen.

00:31:01.790 --> 00:31:02.480
>> Danke Jungs.

00:31:02.480 --> 00:31:09.230
[MUSIK]

00:31:09.230 --> 00:31:11.120
>> Hey, James hier.
Wollte nur einchecken

00:31:11.120 --> 00:31:13.175
und vielen Dank für
sehen Sie sich dieses Video an.

00:31:13.175 --> 00:31:16.265
Jetzt tun Sie alle Dinge, die Sie
wissen, dass Sie so tun möchten, wie

00:31:16.265 --> 00:31:18.710
abonnieren und ding
diese Benachrichtigungsglocke,

00:31:18.710 --> 00:31:20.825
Teil der
Benachrichtigungs-Kader.

00:31:20.825 --> 00:31:22.190
Während Sie hier sind, schauen Sie sich

00:31:22.190 --> 00:31:25.400
all diese tollen Videos
die ich bereits codiert habe.

00:31:25.400 --> 00:31:29.040
Klicken Sie auf das Ding. klicken
es, beobachten Sie es, tun Sie es.

