WEBVTT

00:00:00.000 --> 00:00:01.680
>> Tune w tym tygodniu
Xamarin Pokaż gdzie

00:00:01.680 --> 00:00:03.360
mój dobry przyjaciel Alexi na rozmowie

00:00:03.360 --> 00:00:06.810
o zarządzaniu pamięcią dla
aplikacji. Więc dostroić.

00:00:06.810 --> 00:00:13.200
MUZYKI

00:00:13.200 --> 00:00:14.280
>> Witamy z powrotem, wszyscy,

00:00:14.280 --> 00:00:15.405
do programu Xamarin show.

00:00:15.405 --> 00:00:16.650
Jestem twoim gospodarzem James Montemagno.

00:00:16.650 --> 00:00:17.820
Dzisiaj, mój najlepszy przyjaciel w

00:00:17.820 --> 00:00:21.270
całym świecie Alexi z
Me. Jak to się dzieje, kumpel?

00:00:21.270 --> 00:00:22.905
>> Jestem dobry. A ty?

00:00:22.905 --> 00:00:24.960
>> Robię fantastycznie.
To piękny dzień

00:00:24.960 --> 00:00:26.640
tutaj w Redmond, Washington codziennie.

00:00:26.640 --> 00:00:27.325
>> To jest.

00:00:27.325 --> 00:00:29.085
>> Teraz, jesteś z naszej mobilnej

00:00:29.085 --> 00:00:31.065
doradztwo klienta
zespół, jest to, że poprawne?

00:00:31.065 --> 00:00:31.920
>> To jest poprawne.

00:00:31.920 --> 00:00:33.450
>> Więc co to znaczy?

00:00:33.450 --> 00:00:35.370
>> Oznacza to, że pracujemy z

00:00:35.370 --> 00:00:38.250
naszych klientów, a my
doradzić im oczywiście.

00:00:38.250 --> 00:00:41.645
Ale przede wszystkim pracujemy z deweloperami
i zobacz, jak wykorzystują narzędzia,

00:00:41.645 --> 00:00:44.300
jak współpracują z naszym narzędziem Xamarin,

00:00:44.300 --> 00:00:47.560
i jakie są wspólne
czoła.

00:00:47.560 --> 00:00:48.420
>> Perfect.

00:00:48.420 --> 00:00:50.205
>> Dzisiaj chcę porozmawiać o

00:00:50.205 --> 00:00:52.355
jednym z nich jest zarządzanie pamięcią.

00:00:52.355 --> 00:00:53.780
>> Masz. Tak. To bardzo ważne

00:00:53.780 --> 00:00:55.730
ponieważ często mówimy
o wszystkich fajnych,

00:00:55.730 --> 00:00:57.155
fantazyjne funkcje, które można zrobić,

00:00:57.155 --> 00:01:00.440
ale chcieliśmy mieć to
Seria najlepszych praktyk

00:01:00.440 --> 00:01:02.340
bo wpadasz w kłopoty.

00:01:02.340 --> 00:01:03.820
Zdarza się. To jest tak łatwe do zrobienia.

00:01:03.820 --> 00:01:06.345
Zarządzanie pamięcią,
Szczerze mówiąc, jestem noob.

00:01:06.345 --> 00:01:07.770
Naprawdę nie wiem. Jestem po prostu jak,

00:01:07.770 --> 00:01:09.560
"Oni ' zamierzać zabić
aplikacji w ciągu pięciu sekund.

00:01:09.560 --> 00:01:11.705
Nie ma znaczenia, prawda? " Ale
Nie powinienem myśleć w ten sposób.

00:01:11.705 --> 00:01:14.210
>> To prawda. To jest to, co widzimy

00:01:14.210 --> 00:01:16.850
ponieważ nikt nie dba o
zarządzania pamięcią.

00:01:16.850 --> 00:01:21.300
Mamy tyle pamięci
i nigdy ich nie sprawdzasz.

00:01:21.300 --> 00:01:24.750
To znaczy, kiedy ostatni raz
sprawdzone wykorzystanie pamięci aplikacji?

00:01:24.750 --> 00:01:26.250
>> Ostatni raz dostałem crash.

00:01:26.250 --> 00:01:29.510
Właściwie, miałem bardzo
dobrym przykładem.

00:01:29.510 --> 00:01:31.910
Powiem Ci to. Tę
jest przykładem świata rzeczywistego.

00:01:31.910 --> 00:01:35.120
Mam błąd w Xamarin Essentials

00:01:35.120 --> 00:01:38.375
który mówi, kiedy Dzwonię
tej metody 20 000 razy,

00:01:38.375 --> 00:01:41.570
Moja aplikacja ulega awarii i
bo nie było

00:01:41.570 --> 00:01:45.155
prawidłowo utylizacja
macierzystego obiektu systemu Android,

00:01:45.155 --> 00:01:46.775
okno, wyświetlacz.

00:01:46.775 --> 00:01:48.170
Więc co się dzieje,

00:01:48.170 --> 00:01:50.480
Chciałbym nadal tworzyć
i nigdy nie dostanie

00:01:50.480 --> 00:01:53.135
śmieci zebranych w historii, ponieważ
Nigdy go nie wyrzucałam.

00:01:53.135 --> 00:01:54.890
>> To właśnie mamy zamiar
rozmawiać o dzisiejszych czasach.

00:01:54.890 --> 00:01:56.925
>> Tak. Niesamowite. Załóżmy, że
to. Co masz dla nas?

00:01:56.925 --> 00:02:00.435
>> Więc mamy ten mały
prosta aplikacja z dwoma oknami,

00:02:00.435 --> 00:02:02.745
ekranie głównym i ekranie szczegółów.

00:02:02.745 --> 00:02:06.375
To bardzo wspólny wzór
Kontroler nawigacji interfejsu użytkownika.

00:02:06.375 --> 00:02:09.600
Jest to zwykły Xamarin
Aplikacja na iOS, prawda?

00:02:09.600 --> 00:02:10.305
>> Okay.

00:02:10.305 --> 00:02:12.440
>> Co zamierzamy
zrobić, to wprowadzić

00:02:12.440 --> 00:02:14.930
przecieki pamięci w wielu,
wiele różnych sposobów.

00:02:14.930 --> 00:02:19.025
Ale po pierwsze, chcę porozmawiać o
różnic z rodzimych światowych

00:02:19.025 --> 00:02:23.960
i zarządzany świat
wydajności i pamięci.

00:02:23.960 --> 00:02:25.340
Więc gdy masz proces,

00:02:25.340 --> 00:02:27.995
system operacyjny dający
fragmentu pamięci.

00:02:27.995 --> 00:02:31.370
Powinieneś być świadomy tego, że
ponieważ po zabraknie pamięci,

00:02:31.370 --> 00:02:33.670
awarie aplikacji lub
system operacyjny go zabija.

00:02:33.670 --> 00:02:35.355
W pamięci zarządzanej

00:02:35.355 --> 00:02:40.260
Nasze Xamarin mono uzyskiwanie tych
małą część tej pamięci.

00:02:40.260 --> 00:02:41.630
Wtedy powinniśmy być

00:02:41.630 --> 00:02:43.670
ostrożnym, jak
również użyć tego kawałka.

00:02:43.670 --> 00:02:44.030
>> Okay.

00:02:44.030 --> 00:02:46.640
>> Więc nadal powinieneś być
świadomi pamięci natywnej,

00:02:46.640 --> 00:02:48.905
i teraz, gdy pracujesz z platformą Xamarin,

00:02:48.905 --> 00:02:50.320
również wiedzieć o części zarządzania.

00:02:50.320 --> 00:02:52.740
>> Dostał. Więc masz
pamięć natywna, iOS,

00:02:52.740 --> 00:02:55.980
Android bity i kawałki,
.NET zarządzane pamięci?

00:02:55.980 --> 00:02:56.640
>> To prawda.

00:02:56.640 --> 00:02:57.090
>> Perfect.

00:02:57.090 --> 00:03:00.530
>> Za każdym razem, gdy tworzysz obiekt
i tworzysz, powiedzmy,

00:03:00.530 --> 00:03:02.330
przycisku interfejsu użytkownika,

00:03:02.330 --> 00:03:04.950
natywnego przycisku interfejsu użytkownika i
zarządzanych interfejsu użytkownika przycisku klasy.

00:03:04.950 --> 00:03:06.680
Mają wpływ różnych pamięci.

00:03:06.680 --> 00:03:10.310
Mogą one powodować różne
Problemy z pamięcią, ponieważ nie ma

00:03:10.310 --> 00:03:14.135
również rodzimym sposobem zbierania
śmieci i zarządzane sposób.

00:03:14.135 --> 00:03:20.385
W mono używamy mono Single
garbage collector generacji.

00:03:20.385 --> 00:03:23.460
W rodzimym świecie, iOS używać ARC,

00:03:23.460 --> 00:03:26.680
Android korzysta z własnej
modułowi zbierającemu śmieci,

00:03:26.680 --> 00:03:29.420
ale powinny pracować razem
obok siebie i powinniśmy

00:03:29.420 --> 00:03:32.300
mają je, ponieważ można
wprowadzać problemy za pomocą tego.

00:03:32.300 --> 00:03:32.690
>> Dostał.

00:03:32.690 --> 00:03:34.640
>> Więc pierwszy i

00:03:34.640 --> 00:03:36.950
najprostsze podejście do wprowadzenia

00:03:36.950 --> 00:03:40.830
Problemy z pamięcią to subskrypcja
bez wysubskrypcji.

00:03:42.040 --> 00:03:45.680
Garbage collector powinien znać
gdy jest śmieci.

00:03:45.680 --> 00:03:47.180
Ale skąd mógłby wiedzieć?

00:03:47.180 --> 00:03:49.565
Powinno być w stanie zbudować

00:03:49.565 --> 00:03:53.915
Wykres drzewa osiągalności
i zaczyna się od tras.

00:03:53.915 --> 00:03:57.320
Nasze statyczne zdarzenia, zmienne statyczne,

00:03:57.320 --> 00:03:59.350
statyczne zdarzenia lub wywołania rolki wątku,

00:03:59.350 --> 00:04:01.910
wszystkie dostępne trasy i

00:04:01.910 --> 00:04:05.005
odśmiecania pamięci traktuje
je jako nie śmieci.

00:04:05.005 --> 00:04:06.810
Więc gdy subskrybujesz tak,

00:04:06.810 --> 00:04:09.560
Weźmy wtyczki łączności.

00:04:09.560 --> 00:04:11.960
Wiem, James, jesteś
zaznajomiony z tym pluginem.

00:04:11.960 --> 00:04:13.400
>> Jestem. Tak. Bardzo dużo.

00:04:13.400 --> 00:04:14.960
Lubię to. Cala
tutaj jesteśmy po prostu co?

00:04:14.960 --> 00:04:16.220
Subskrybowanie zdarzenia,

00:04:16.220 --> 00:04:18.610
i może to być dowolna
zdarzenia, takie jak zdarzenie Click,

00:04:18.610 --> 00:04:20.360
masz zdarzenie zmiany czujnika.

00:04:20.360 --> 00:04:22.715
Zasadniczo, cokolwiek kiedykolwiek w .NET.

00:04:22.715 --> 00:04:25.970
>> Tak. Jest to specyficzna
nie tylko do platformy Xamarin.

00:04:25.970 --> 00:04:27.830
To dowolne zdarzenie statyczne

00:04:27.830 --> 00:04:31.745
w .NET i łączność
tutaj jest tylko przykładem.

00:04:31.745 --> 00:04:35.390
Co staram się powiedzieć, to
może być dowolne zdarzenie statyczne lub

00:04:35.390 --> 00:04:38.960
dowolne zdarzenie dostarczone singleton.

00:04:38.960 --> 00:04:40.880
Więc zawsze, gdy subskrybujemy tak,

00:04:40.880 --> 00:04:42.520
i powiedzmy, że mamy

00:04:42.520 --> 00:04:47.100
Ten mały mały kawałek
ConnectivityChanged obsługi.

00:04:47.100 --> 00:04:49.655
Wprowadzamy niewielki przeciek pamięci.

00:04:49.655 --> 00:04:54.290
Jest mały, ponieważ nasz pogląd jest
dość proste i lekkie,

00:04:54.290 --> 00:04:55.400
ale jest to przeciek pamięci.

00:04:55.400 --> 00:04:57.685
>> Więc jest to przeciek pamięci, dlaczego jednak?

00:04:57.685 --> 00:05:00.860
>> Ponieważ ta łączność i

00:05:00.860 --> 00:05:03.830
Zdarzenie ConnectivityChanged
jest statycznym odniesieniem

00:05:03.830 --> 00:05:05.270
dla naszych garbage collector.

00:05:05.270 --> 00:05:06.980
Gdy nasze śmieci
kolektor próbuje

00:05:06.980 --> 00:05:08.810
określić, czy jest to śmieci, czy nie,

00:05:08.810 --> 00:05:11.015
nie dlatego, że

00:05:11.015 --> 00:05:14.540
ConnectivityChanged zdarzenie ma
odniesienie do tego programu obsługi,

00:05:14.540 --> 00:05:17.375
i ten program obsługi faktycznie obsługuje

00:05:17.375 --> 00:05:21.080
odniesienie do naszych
Właściwość DetailsViewController.

00:05:21.080 --> 00:05:24.680
>> Widzę. Mam. Dlatego
utworzyła to wydarzenie wewnątrz

00:05:24.680 --> 00:05:29.600
tym ViewController i mam
subskrybowane, ale nigdy nie są subskrybowane.

00:05:29.600 --> 00:05:31.970
Tak więc zawsze ma to
natychmiast odwołać.

00:05:31.970 --> 00:05:34.940
Tak garbage kolekcjonerów mówi
"Hej, co jest dostępne?"

00:05:34.940 --> 00:05:37.030
To idzie: "nie możesz tego mieć".

00:05:37.030 --> 00:05:38.205
>> To jest poprawne.

00:05:38.205 --> 00:05:40.580
>> Chcę się upewnić, że
to jest poprawne, bo

00:05:40.580 --> 00:05:42.185
Wierzę, że tak
to działa w moim umyśle.

00:05:42.185 --> 00:05:43.150
Chcę mieć pewność, że mam rację.

00:05:43.150 --> 00:05:47.225
>> Pojedynczego zadania garbage collector
nie jest deallocate pamięci,

00:05:47.225 --> 00:05:48.605
i zrobić to właściwie,

00:05:48.605 --> 00:05:50.540
garbage collector powinien wiedzieć, jak

00:05:50.540 --> 00:05:52.730
prawidłowo określić, czy
to śmieci, czy nie.

00:05:52.730 --> 00:05:53.180
>> Dostał.

00:05:53.180 --> 00:05:55.790
>> Więc zbudować drzewo osiągalności,

00:05:55.790 --> 00:05:59.270
modułowi zbierającemu śmieci
używa tras statycznych lub

00:05:59.270 --> 00:06:01.430
tylko trasy i zdarzenia statyczne

00:06:01.430 --> 00:06:03.500
lub dowolnej właściwości statycznej
jako jedną z tras.

00:06:03.500 --> 00:06:06.460
Również zmienne lokalne,
wiele innych rzeczy.

00:06:06.460 --> 00:06:07.020
>> Dostał.

00:06:07.020 --> 00:06:11.820
>> Więc pozwól mi po prostu go uruchomić
i pokazać, jak to działa.

00:06:11.820 --> 00:06:14.745
Czy uważasz, że będziemy
zobaczyć różnicę?

00:06:14.745 --> 00:06:17.540
>> Nie wiem. Mam na myśli
miejmy nadzieję, że nie dlatego,

00:06:17.540 --> 00:06:20.090
to jest tak proste, co mam na myśli.

00:06:20.090 --> 00:06:22.160
Teraz, mój strach jest jednak to, że

00:06:22.160 --> 00:06:24.200
ponieważ rejestrujemy się ponad
i w kółko,

00:06:24.200 --> 00:06:26.750
Jeśli zmieniamy wydarzenia,

00:06:26.750 --> 00:06:28.850
Jesteśmy prawdopodobnie coraz
w wielu wydarzeniach.

00:06:28.850 --> 00:06:30.635
>> tak. Sprawdźmy to.

00:06:30.635 --> 00:06:33.560
Więc przeniosłam się do strony Szczegóły.

00:06:33.560 --> 00:06:36.185
Mam zamiar odłączyć Wi-Fi teraz.

00:06:36.185 --> 00:06:38.510
>> Tutaj, jesteśmy przy użyciu
Symulatorze systemu iOS.

00:06:38.510 --> 00:06:41.975
Więc to faktycznie za pomocą
w Internecie urządzenia.

00:06:41.975 --> 00:06:46.460
>> Tak. Po prostu dostał wydarzenie tutaj
które są ConnectivityChanged.

00:06:46.460 --> 00:06:51.910
Wróćmy kilka razy
i jeszcze kilka razy,

00:06:51.910 --> 00:06:54.630
i wracam na stronę główną.

00:06:54.630 --> 00:06:58.215
Nie jestem delikatna w
coś już teraz,

00:06:58.215 --> 00:07:01.280
i zakładam, że moje dane
Strona już nie ma, prawda?

00:07:01.280 --> 00:07:01.430
>> tak.

00:07:01.430 --> 00:07:02.810
>> Mój program obsługi subskrypcji

00:07:02.810 --> 00:07:04.805
nie powinno działać, ponieważ
Nie zrobiłem nic.

00:07:04.805 --> 00:07:07.015
Włączmy Wi-Fi.

00:07:07.015 --> 00:07:09.510
>> Okay. Tak naprawdę stworzyliśmy

00:07:09.510 --> 00:07:11.910
to ConnectivityChanged
na drugiej stronie.

00:07:11.910 --> 00:07:12.420
>> Druga strona.

00:07:12.420 --> 00:07:13.665
>> Cóż, jestem na pierwszej stronie.

00:07:13.665 --> 00:07:17.440
>> Tak. Więc nie spodziewamy się
Nasz program obsługi do pracy,

00:07:17.440 --> 00:07:18.645
ale spójrz, co mamy.

00:07:18.645 --> 00:07:21.090
Właśnie dostaliśmy cztery programy obsługi
kolejny nasz kod,

00:07:21.090 --> 00:07:23.600
i może to być dowolna
kod aktualizacji bazy danych,

00:07:23.600 --> 00:07:25.505
Zapisywanie ustawień, cokolwiek.

00:07:25.505 --> 00:07:28.070
Kwestia ta nie tylko
z zarządzaniem pamięcią

00:07:28.070 --> 00:07:30.635
ponieważ ma trochę pamięci.

00:07:30.635 --> 00:07:34.970
To również kwestia, ponieważ mamy
część kodu do wykonania, jak również.

00:07:34.970 --> 00:07:37.445
>> To oznacza, że
, że strona szczegóły,

00:07:37.445 --> 00:07:39.350
teraz nigdy nie może być
Runtimecallablewrapper?

00:07:39.350 --> 00:07:42.455
Więc teraz po prostu mam to
Strona szczegółów zawsze w pamięci.

00:07:42.455 --> 00:07:43.400
>> Niestety tak.

00:07:43.400 --> 00:07:44.660
>> Oh my dobroć, to źle.

00:07:44.660 --> 00:07:47.385
>> To źle. Jako deweloper,

00:07:47.385 --> 00:07:49.560
nie zawsze widzimy.

00:07:49.560 --> 00:07:54.280
Jako użytkownik widzę, że moja aplikacja ulega awarii
jak raz w tygodniu, cokolwiek.

00:07:54.280 --> 00:07:56.675
JA just odnawiać zapas towarów ono
i nadal z niego korzystać.

00:07:56.675 --> 00:07:58.220
Dlatego nie jest to zgłaszane,

00:07:58.220 --> 00:08:00.350
to nie jest brane bardzo poważnie,

00:08:00.350 --> 00:08:03.950
ale jest to problem, zwłaszcza jeśli

00:08:03.950 --> 00:08:08.330
uzyskać ogromny obraz nie
który wpływa na pamięć.

00:08:08.330 --> 00:08:10.910
Więc mam zamiar odkomentować
Ten wiersz kodu,

00:08:10.910 --> 00:08:14.680
które faktycznie dodaje trochę obciążenia pamięci

00:08:14.680 --> 00:08:19.740
tu i jest załadunek
obrazu z Internetu.

00:08:19.740 --> 00:08:22.265
Robimy tylko losowy obraz.

00:08:22.265 --> 00:08:24.815
Pozwól mi pokazać, że to naprawdę losowe.

00:08:24.815 --> 00:08:27.035
Zobaczmy, co mamy tutaj.

00:08:27.035 --> 00:08:29.510
Zawsze martwię się o to.

00:08:29.510 --> 00:08:32.210
Okk. Więc mamy ten losowy obraz,

00:08:32.210 --> 00:08:34.370
i to właśnie my jesteśmy
wchodząc w

00:08:34.370 --> 00:08:37.190
naszej aplikacji za każdym razem,
Przejdź do strony Szczegóły.

00:08:37.190 --> 00:08:37.610
>> Okay.

00:08:37.610 --> 00:08:40.395
>> Pozwól mi pokazać to tutaj.

00:08:40.395 --> 00:08:42.970
>> To jest zupełnie coś
że to, co zawsze się stało, prawda?

00:08:42.970 --> 00:08:45.220
Ponieważ przejdź do strony Szczegóły,

00:08:45.220 --> 00:08:46.740
prawdopodobnie załadować kilka informacji,

00:08:46.740 --> 00:08:48.080
może pociągać za sobą
informacje z

00:08:48.080 --> 00:08:51.095
bazy danych na tym ekranie,
i to może być złe.

00:08:51.095 --> 00:08:53.930
>> Wyobraź sobie, że jesteś
za pomocą aplikacji Instagram.

00:08:53.930 --> 00:08:55.330
Masz tam stronę szczegółów.

00:08:55.330 --> 00:08:56.710
Stukasz i obserwujesz,

00:08:56.710 --> 00:08:58.435
wejść w szczegóły, wrócił.

00:08:58.435 --> 00:09:00.720
Idź sprawdzić inny folder,
wejść w szczegóły,

00:09:00.720 --> 00:09:03.920
wrócił, a w tygodniu aplikacja
wywala i nikt nie wie dlaczego.

00:09:03.920 --> 00:09:06.680
To jest, gdy problemy z pamięcią
może wejść w grę.

00:09:06.680 --> 00:09:09.180
>> Masz.

00:09:09.180 --> 00:09:11.855
>> Nie pokażę ci, że
przeciek pamięci jest nadal

00:09:11.855 --> 00:09:14.650
bo chcę pokazać
Profiler,

00:09:14.650 --> 00:09:16.375
w jaki sposób można zidentyfikować te problemy.

00:09:16.375 --> 00:09:17.800
Aby zidentyfikować te problemy,

00:09:17.800 --> 00:09:19.990
masz kilka narzędzi.

00:09:19.990 --> 00:09:23.350
Przede wszystkim, to rodzime narzędzia,
iOs dostarcza instrumenty,

00:09:23.350 --> 00:09:25.520
i drugi jest narzędziem zarządzanym,

00:09:25.520 --> 00:09:27.005
który jest Xamarin Profiler.

00:09:27.005 --> 00:09:27.990
>> Masz.

00:09:27.990 --> 00:09:29.520
>> Dlaczego myślicie, że potrzebujemy obu?

00:09:29.520 --> 00:09:32.985
>> Cóż, robią różne rzeczy.

00:09:32.985 --> 00:09:36.090
>> tak. Rzeczywiście
z powodu tego obrazu.

00:09:36.090 --> 00:09:38.025
Pamiętaj. Mówiłam o tym.

00:09:38.025 --> 00:09:41.565
Oni rzeczywiście puszka metalowa znać
o własnej części.

00:09:41.565 --> 00:09:44.190
Więc Profiler Xamarin nie wie nic

00:09:44.190 --> 00:09:47.100
o pamięci natywnej
obiektów tam utworzonych,

00:09:47.100 --> 00:09:50.010
i rodzimych instrumentów nie
wiedzieć o pamięci zarządzanej.

00:09:50.010 --> 00:09:52.685
To tylko powiedzieć, że istnieje kilka
fragment utworzonego obiektu.

00:09:52.685 --> 00:09:54.710
Gdy mono tworzy obiekt,

00:09:54.710 --> 00:09:57.275
ono wciąż bind ono jakoś
do obiektów macierzystych.

00:09:57.275 --> 00:09:59.210
Więc ci, którzy będą mogli zobaczyć,

00:09:59.210 --> 00:10:00.500
ale cała reszta nie będzie.

00:10:00.500 --> 00:10:01.220
>> Okay. Cool.

00:10:01.220 --> 00:10:02.945
>> Więc Zobaczmy Xamarin Profiler.

00:10:02.945 --> 00:10:06.550
Łatwiej jest zrozumieć
na początku,

00:10:06.550 --> 00:10:10.955
i pokazuje również ładne
nazw i jak nazewnictwa.

00:10:10.955 --> 00:10:12.815
Można więc zidentyfikować obiekt.

00:10:12.815 --> 00:10:16.715
Jest mały przycisk "Run"
i "Rozpocznij profil" tutaj.

00:10:16.715 --> 00:10:20.050
Potrzebujesz przedsiębiorstwa
licencję, aby to zrobić.

00:10:20.050 --> 00:10:23.870
Ale to bardzo wygodne i
Zachęcam do tego.

00:10:23.870 --> 00:10:25.190
Więc gdy to zrobisz,

00:10:25.190 --> 00:10:26.825
to faktycznie buduje aplikację z

00:10:26.825 --> 00:10:31.130
Niektóre dodatkowe metadane i
kod osadzony w aplikacji.

00:10:31.130 --> 00:10:33.580
Mogliśmy więc zobaczyć i
śledzenia obiektów.

00:10:33.580 --> 00:10:36.140
>> Teraz jedna rzecz, podczas gdy to
jest budowanie i wdrażanie jest,

00:10:36.140 --> 00:10:38.030
Pracujemy na
symulator, co oznacza, że

00:10:38.030 --> 00:10:40.520
ma pełną moc tego.

00:10:40.520 --> 00:10:45.320
Czy to jest w porządku, że robię to
i profilowanie go na moim urządzeniu,

00:10:45.320 --> 00:10:49.150
Czy lepiej jest zrobić to na
fizyczny iPhone, na przykład?

00:10:49.150 --> 00:10:50.570
>> To dobre pytanie, ponieważ

00:10:50.570 --> 00:10:52.340
może wykonywać różne rodzaje profilowania.

00:10:52.340 --> 00:10:52.940
>> Ciekawe.

00:10:52.940 --> 00:10:54.230
>> Jeśli profilujesz CPU,

00:10:54.230 --> 00:10:56.480
to nie jest dobry pomysł
to zrobić na symulatorze

00:10:56.480 --> 00:10:58.820
ponieważ nie
pełną moc urządzenia.

00:10:58.820 --> 00:11:01.340
Ale jeśli robisz pamięć
profilera i alokacji,

00:11:01.340 --> 00:11:04.355
otrzymasz te same problemy
na symulatorze i na urządzeniu.

00:11:04.355 --> 00:11:04.730
>> Perfect.

00:11:04.730 --> 00:11:10.300
>> Lubię robić to na laptopie
ponieważ po prostu zaczyna się szybciej.

00:11:10.300 --> 00:11:13.010
Nie tłumaczy kodu

00:11:13.010 --> 00:11:16.085
w natywnych instrukcjach i po prostu
symuluje i działa natychmiast.

00:11:16.085 --> 00:11:18.470
Więc zawsze, gdy robisz profilowania pamięci,

00:11:18.470 --> 00:11:20.180
Jeśli uruchamiasz aplikacje tak wiele razy,

00:11:20.180 --> 00:11:23.045
więc masz zamiar się tego spodobać.

00:11:23.045 --> 00:11:25.085
Pozwól mi zrobić ten sam test.

00:11:25.085 --> 00:11:27.980
Więc otworzyłem stronę szczegóły raz,

00:11:27.980 --> 00:11:29.840
i widzisz ten mały szczyt tutaj.

00:11:29.840 --> 00:11:33.590
Oznacza to, że zwiększyliśmy nasze
wykorzystanie pamięci znacząco.

00:11:33.590 --> 00:11:35.915
Ale nie widzisz tego
zwiększenie pamięci tutaj.

00:11:35.915 --> 00:11:38.510
To jeszcze jak największy obiekt jest

00:11:38.510 --> 00:11:40.730
drzewa systemów i gdzieś tutaj.

00:11:40.730 --> 00:11:43.155
Pozwól mi zrobić to jeszcze kilka razy.

00:11:43.155 --> 00:11:45.815
Znowu ją zwiększę.

00:11:45.815 --> 00:11:47.610
Zobaczysz skok tutaj,

00:11:47.610 --> 00:11:49.735
ale nie widzisz żadnych kolców tutaj.

00:11:49.735 --> 00:11:53.330
Co oznacza, że kiedy przydzielamy
w pamięci natywnej,

00:11:53.330 --> 00:11:56.220
nie odzwierciedla
go w zarządzanym świecie,

00:11:56.220 --> 00:11:59.419
ale widzimy, że całkowita pamięć jest
wzrost i nie cofanie przydziału,

00:11:59.419 --> 00:12:00.720
co jest najważniejszą rzeczą.

00:12:00.720 --> 00:12:01.455
>> Widzę.

00:12:01.455 --> 00:12:04.015
>> Wracamy z tą migawką.

00:12:04.015 --> 00:12:05.710
Migawka pamięci faktycznie działa

00:12:05.710 --> 00:12:07.875
kolekcji modułowi
na zarządzanym miejscu.

00:12:07.875 --> 00:12:10.195
Więc robimy to zdjęcie.
Zrobię jeszcze jeden.

00:12:10.195 --> 00:12:11.755
Wyjaśnię to później,

00:12:11.755 --> 00:12:14.500
do czynienia z Cue finalizacji.

00:12:14.500 --> 00:12:17.475
Ale w zasadzie, teraz jest czysta pamięć.

00:12:17.475 --> 00:12:19.605
Upewnimy się, że
Nasz garbage collector

00:12:19.605 --> 00:12:22.270
już prowadził i alokację
cały nabyty obiekt.

00:12:22.270 --> 00:12:23.920
Nadal widzimy tam wspomnienia.

00:12:23.920 --> 00:12:25.845
Więc nadal poszedł w dół.

00:12:25.845 --> 00:12:28.755
Aby wiedzieć, co się tu dzieje,

00:12:28.755 --> 00:12:32.005
po prostu idź tutaj i
Użyj przycisku filtra.

00:12:32.005 --> 00:12:35.265
Staramy się identyfikować
tylko obiekty R,

00:12:35.265 --> 00:12:38.110
i chcę również zobaczyć na
żywych obiektów tutaj.

00:12:38.110 --> 00:12:40.980
Więc uderzyć to "Apply"
przycisk i voila,

00:12:40.980 --> 00:12:43.575
widzimy dwa szczegóły kontrolera
wiszące w pamięci,

00:12:43.575 --> 00:12:47.160
Mimo, że nie
mają szczegóły w miejscu.

00:12:47.160 --> 00:12:48.570
>> Super próbka, więc powiedział,

00:12:48.570 --> 00:12:50.289
znaleźć wszystko w mojej nazwie-Space,

00:12:50.289 --> 00:12:51.610
Filtr na tym.

00:12:51.610 --> 00:12:54.820
Dosłownie to, co widzimy tutaj
jest kontroler widoku szczegółów 2.

00:12:54.820 --> 00:12:55.225
>> tak.

00:12:55.225 --> 00:12:56.650
>> Ale powinno być zniknęły.

00:12:56.650 --> 00:13:00.015
>> Zaczę od największego
obiektów na tych stronach.

00:13:00.015 --> 00:13:00.280
>> tak.

00:13:00.280 --> 00:13:02.865
>> To prawda dla Androida, jak również.

00:13:02.865 --> 00:13:04.030
Wystarczy wyszukać działania,

00:13:04.030 --> 00:13:05.395
Zobacz modele, lub cokolwiek,

00:13:05.395 --> 00:13:07.875
bo skoro masz widok
Model wisi tam,

00:13:07.875 --> 00:13:11.320
zaczyna łączyć wszystkie
innych obiektów.

00:13:11.320 --> 00:13:13.380
Wszystkie usługi, wszystkie powiązania,

00:13:13.380 --> 00:13:16.605
wszystkie UIs, i będzie
uzyskać dużo pamięci.

00:13:16.605 --> 00:13:17.500
>> Dostał.

00:13:17.500 --> 00:13:19.465
>> Pozwól mi pokazać, że to prawda.

00:13:19.465 --> 00:13:23.260
Będę go otworzyć jeszcze jeden
czas, naciśnij "snapshot".

00:13:23.260 --> 00:13:25.455
Widzimy tu trzy przypadki.

00:13:25.455 --> 00:13:28.569
Wracam, uderzając "snapshot",

00:13:28.569 --> 00:13:30.030
i pozostaje w pamięci.

00:13:30.030 --> 00:13:30.660
>> Masz.

00:13:30.660 --> 00:13:32.500
>> Więc naprawimy ten problem z pamięcią.

00:13:32.500 --> 00:13:33.700
>> Jestem gotowy.

00:13:33.700 --> 00:13:36.470
>> Jak byś to naprawia?

00:13:41.220 --> 00:13:43.525
Jest to strona szczegółów,

00:13:43.525 --> 00:13:45.460
więc musimy zrezygnować z subskrypcji
w pewnym wypadku.

00:13:45.460 --> 00:13:49.325
>> Masz. Więc prawdziwym problemem tutaj
jest subskrybentem wydarzenia.

00:13:49.325 --> 00:13:49.970
>> Tak.

00:13:49.970 --> 00:13:52.135
>> Następnie powinniśmy zrezygnować, prawda?

00:13:52.135 --> 00:13:54.550
>> To jest poprawne. Tę
jest dobrą praktyką.

00:13:54.550 --> 00:13:56.370
Ilekroć widzisz ten Plus równe,

00:13:56.370 --> 00:13:59.490
po prostu wyszukać, jeśli
jest równe minus,

00:13:59.490 --> 00:14:01.980
Jeśli nie,
powinno to wprowadzić.

00:14:01.980 --> 00:14:02.595
>> Dostał.

00:14:02.595 --> 00:14:05.020
>> Jest to pierwsze wskazanie
że masz przeciek pamięci.

00:14:05.020 --> 00:14:05.340
>> Dostał.

00:14:05.340 --> 00:14:10.460
>> Jedynym wyjątkiem jest, gdy
subskrybujesz na stronie głównej,

00:14:10.460 --> 00:14:12.285
jak na naszej stronie głównej,

00:14:12.285 --> 00:14:14.725
i jesteś pewien, że ta strona

00:14:14.725 --> 00:14:18.010
nie będzie w stanie przejść
najbliższym czasie.

00:14:18.010 --> 00:14:20.115
>> Może masz go na
poziom delegata aplikacji.

00:14:20.115 --> 00:14:21.530
Jesteś jak, faktycznie
chcesz to być

00:14:21.530 --> 00:14:23.290
globalne wydarzenie na cały czas.

00:14:23.290 --> 00:14:25.845
Ale także może, gdy Twoja aplikacja
przechodzi w tło,

00:14:25.845 --> 00:14:27.295
należy również zrezygnować.

00:14:27.295 --> 00:14:28.345
>> To prawda.

00:14:28.345 --> 00:14:28.675
>> tak.

00:14:28.675 --> 00:14:29.700
>> Nie do wykonania.

00:14:29.700 --> 00:14:31.750
>> Więc teraz mówisz
gdy się pojawi,

00:14:31.750 --> 00:14:33.855
będzie subskrybować i znikają,

00:14:33.855 --> 00:14:35.935
anulować subskrypcję, a następnie
zdjąć górną górę.

00:14:35.935 --> 00:14:37.990
>> Tak, usunąłem z chmury,

00:14:37.990 --> 00:14:39.710
ponieważ chcemy
uruchomić go za każdym razem, gdy

00:14:39.710 --> 00:14:42.040
pojawiają się i za każdym razem znikają.

00:14:42.040 --> 00:14:43.850
Plus równe subskrybować,

00:14:43.850 --> 00:14:45.640
minus równa się wypisać.

00:14:45.640 --> 00:14:48.735
Nic skomplikowanego, po prostu chcesz

00:14:48.735 --> 00:14:52.045
Upewnij się, że nie potrzebujemy
instrumentów, gdy tylko przejdziesz przez nią.

00:14:52.045 --> 00:14:52.720
>> Cool.

00:14:52.720 --> 00:14:55.110
>> Więc robię te same rzeczy,

00:14:55.110 --> 00:14:59.490
będzie szczegóły,
pokazując, że to prawda.

00:14:59.490 --> 00:15:02.980
Biorąc migawkę,
Filtr do moich wydarzeń.

00:15:02.980 --> 00:15:05.300
Przepraszam. Po prostu kliknąłem.

00:15:08.700 --> 00:15:12.170
Zobaczmy na żywo obiektów.

00:15:12.420 --> 00:15:15.345
Powinniśmy zobaczyć szczegóły
ponieważ jesteśmy obecnie na

00:15:15.345 --> 00:15:17.475
stronie szczegółów. Wracamy.

00:15:17.475 --> 00:15:18.990
Trafiliśmy "snapshot"

00:15:18.990 --> 00:15:20.880
i czego oczekujemy tutaj?

00:15:20.880 --> 00:15:23.715
Po pierwsze, wyrzucanie elementów bezużytecznych faktycznie

00:15:23.715 --> 00:15:26.065
umieścić te obiekty w
Finalizacja Cue,

00:15:26.065 --> 00:15:27.625
ale drugi powinien Cue 1,

00:15:27.625 --> 00:15:30.340
lub prawdopodobnie nadal ten sam.

00:15:30.340 --> 00:15:31.570
>> Teraz poszedł.

00:15:31.570 --> 00:15:33.910
>> Tak. Więc pozwól mi mówić o

00:15:33.910 --> 00:15:36.940
Finalizacja Cue w
Po drugie, ale na razie

00:15:36.940 --> 00:15:40.395
chodzi o to, że mamy
stracił nasz Widok szczegółów,

00:15:40.395 --> 00:15:43.135
i nasze wykorzystanie pamięci zbliża.

00:15:43.135 --> 00:15:43.770
>> Piękne.

00:15:43.770 --> 00:15:46.150
>> W ten sposób Naprawiamy przecieki pamięci.

00:15:46.150 --> 00:15:49.420
>> tak. Subskrybujesz
Zdarzenia. Anuluj subskrypcję wydarzeń.

00:15:49.420 --> 00:15:51.630
>> Podstawowa zasada.

00:15:51.630 --> 00:15:54.915
>> To naprawdę zabawne zbyt
ponieważ jeden, to przyczyną dwóch problemów.

00:15:54.915 --> 00:15:56.800
Widzieliśmy, że zachowujesz go przy życiu

00:15:56.800 --> 00:15:58.750
ponieważ te wydarzenia nadal idą.

00:15:58.750 --> 00:16:00.715
Więc teraz strzelasz
je wielokrotnie,

00:16:00.715 --> 00:16:04.290
ale także cokolwiek na tej stronie
pozostanie w pamięci.

00:16:04.290 --> 00:16:06.685
>> To prawda. Dlatego
Dodaliśmy ciężki obraz,

00:16:06.685 --> 00:16:08.205
i nadal znajduje się w pamięci.

00:16:08.205 --> 00:16:08.830
>> Dostał.

00:16:08.830 --> 00:16:10.570
>> Pozwól mi pokazać Ci instrumenty.

00:16:10.570 --> 00:16:13.390
Więc zamierzam przedstawić
z powrotem nasz przeciek pamięci.

00:16:13.390 --> 00:16:13.800
>> Pewnie.

00:16:13.800 --> 00:16:15.985
>> Wystarczy usunąć zdarzenie anulowanie subskrypcji.

00:16:15.985 --> 00:16:18.435
Zamierzam wdrożyć do mojego symulatora,

00:16:18.435 --> 00:16:21.330
i instrumenty działa dość łatwo.

00:16:21.330 --> 00:16:23.355
Wystarczy wybrać cel z

00:16:23.355 --> 00:16:25.930
symulatorze i
aplikacji, i to jest to.

00:16:25.930 --> 00:16:28.435
To wszystko, co musisz zacząć
Narzędzia Profiler.

00:16:28.435 --> 00:16:30.175
Mimo że jest to aplikacja Xamarin,

00:16:30.175 --> 00:16:32.150
można go uruchomić w prawo
z instrumentów,

00:16:32.150 --> 00:16:33.615
który nie wie nic o Xamarin.

00:16:33.615 --> 00:16:35.310
>> Skąd pochodzą instrumenty?

00:16:35.310 --> 00:16:38.709
>> Apple. To Apple
Narzędzie, pochodzi z Xcode,

00:16:38.709 --> 00:16:41.950
i ma wiele
narzędzi wewnątrz niego.

00:16:41.950 --> 00:16:43.450
>> Więc jest po prostu zbudowany w
ponieważ masz już

00:16:43.450 --> 00:16:45.415
Xcode zainstalowane? Więc
Każdy ma to?

00:16:45.415 --> 00:16:46.015
>> To za darmo.

00:16:46.015 --> 00:16:48.925
>> To za darmo. Cool. Więc każdy
można użyć tego już dziś?

00:16:48.925 --> 00:16:53.880
>> Tak. W rzeczywistości można
Zobacz te działania,

00:16:53.880 --> 00:16:57.920
Mimo że są one tworzone przez
świat jak szczegóły działalności,

00:16:57.920 --> 00:17:00.525
nadal jest reprezentowana
przez obiekt macierzysty.

00:17:00.525 --> 00:17:00.930
>> Dostał.

00:17:00.930 --> 00:17:02.855
>> Więc Przyjrzyjmy się temu obiektowi.

00:17:02.855 --> 00:17:07.240
Nazywamy to kontroler widoku szczegółów.

00:17:07.240 --> 00:17:09.595
Pozwól mi stworzyć kilka z nich.

00:17:09.595 --> 00:17:11.030
>> To jest rzeczywiście
naprawdę fajne, ponieważ

00:17:11.030 --> 00:17:12.240
Nigdy nie używałem Instruments,

00:17:12.240 --> 00:17:15.295
nie mów nikomu, w latach.

00:17:15.295 --> 00:17:18.440
Nie sądzę, każdy daje
mi szczegół. Więc istnieje?

00:17:18.440 --> 00:17:20.070
>> Tak, istnieje.

00:17:20.070 --> 00:17:22.335
>> To ma sens
ponieważ Xamarin jest macierzystym,

00:17:22.335 --> 00:17:23.770
więc tworzy obiekt macierzysty.

00:17:23.770 --> 00:17:26.380
>> Tak. Nie musisz robić

00:17:26.380 --> 00:17:27.885
migawkę pamięci tutaj

00:17:27.885 --> 00:17:29.975
ponieważ nie mamy
kolekcji garbage tutaj.

00:17:29.975 --> 00:17:33.780
System IOS używa hierarchii, która jest
Automatyczny licznik referencyjny.

00:17:33.780 --> 00:17:35.605
W zasadzie, gdy
tworzysz obiekt,

00:17:35.605 --> 00:17:37.065
zwiększa licznik,

00:17:37.065 --> 00:17:39.550
Kiedy nie używasz lub

00:17:39.550 --> 00:17:42.505
odchodzi od zakresu
użycia, dekrementuje licznika.

00:17:42.505 --> 00:17:43.845
Gdy licznik jest zerowy,

00:17:43.845 --> 00:17:46.495
Obiekt jest śmieci, a
można je gromadzić.

00:17:46.495 --> 00:17:48.075
Więc jest to dość łatwe do uruchomienia

00:17:48.075 --> 00:17:51.735
Instrumenty z aplikacją
po prostu klikając ten przycisk.

00:17:51.735 --> 00:17:53.505
Uruchamia aplikację,

00:17:53.505 --> 00:17:55.860
pokazuje użycie pamięci tutaj.

00:17:55.860 --> 00:17:57.690
Otwórz stronę szczegóły.

00:17:57.690 --> 00:18:00.425
>> Masz. Instrumentów
pochodzi z Apple?

00:18:00.425 --> 00:18:02.040
>> Instrumenty pochodzą z Apple.

00:18:02.040 --> 00:18:03.350
To bezpłatne narzędzie firmy Apple.

00:18:03.350 --> 00:18:04.490
Możesz użyć tego już teraz.

00:18:04.490 --> 00:18:05.390
>> Cool.

00:18:05.390 --> 00:18:06.970
>> Widzisz również

00:18:06.970 --> 00:18:10.140
ten ślad pamięć prawy
tutaj po otwarciu strony Szczegóły.

00:18:10.140 --> 00:18:12.120
Otwórz go jeszcze raz.

00:18:12.120 --> 00:18:15.140
>> Więc jest to bardzo podobne
do profilera Xamarin,

00:18:15.140 --> 00:18:16.870
ale to będzie nas pokazując

00:18:16.870 --> 00:18:19.240
natywnego stosu dla wszystkich
intencje i cele.

00:18:19.240 --> 00:18:21.500
>> To prawda. Niestety,

00:18:21.500 --> 00:18:24.090
nic nie wie o
Xamarin i zarządzanego świata,

00:18:24.090 --> 00:18:27.025
więc nie będziesz w stanie zobaczyć
utworzonego obiektu zarządzanego.

00:18:27.025 --> 00:18:28.990
Więc widzisz skok,

00:18:28.990 --> 00:18:30.850
i widzisz, że nie odejdę.

00:18:30.850 --> 00:18:33.350
Więc pozwól mi zrobić to po raz trzeci,

00:18:33.350 --> 00:18:35.145
i po prostu Pokaż obiekty.

00:18:35.145 --> 00:18:38.455
Zobaczmy więc. Istnieje
mały przycisk filtra.

00:18:38.455 --> 00:18:43.170
Idziemy do wszystkich alokacji tutaj,

00:18:43.170 --> 00:18:45.165
i naciśnij "Szczegóły".

00:18:45.165 --> 00:18:45.820
>> Okay.

00:18:45.820 --> 00:18:47.555
>> To jest trzy strony tutaj,

00:18:47.555 --> 00:18:48.660
wszystkie są w pamięci,

00:18:48.660 --> 00:18:50.650
i przydzielają w pamięci.

00:18:50.650 --> 00:18:54.070
Nie będę pokazując, jak deallocate
go, ponieważ jest to ta sama poprawka,

00:18:54.070 --> 00:18:57.020
po prostu zrezygnować,
zarządzany świat Anuluje subskrypcje

00:18:57.020 --> 00:19:00.120
z obiektu. Obiektu
uważane za śmieci.

00:19:00.120 --> 00:19:04.660
Następnie nasz garbage collector
gromadzi te informacje,

00:19:04.660 --> 00:19:06.460
następnie natywny może zbierać
bo nic nie

00:19:06.460 --> 00:19:08.490
z zarządzania światem
już do tego.

00:19:08.490 --> 00:19:10.780
>> Sens. Tak bardzo
dużo ten sam utrwalić,

00:19:10.780 --> 00:19:12.255
ale inny sposób, aby go wykryć.

00:19:12.255 --> 00:19:15.045
>> To prawda. Więc to jest

00:19:15.045 --> 00:19:19.345
o różnicach między
zarządzanym i rodzimym świecie.

00:19:19.345 --> 00:19:22.120
Moje następne przykłady będą
głównie o zarządzaniu

00:19:22.120 --> 00:19:25.320
świecie, ponieważ można
wprowadzenie problemu w

00:19:25.320 --> 00:19:26.905
i nie jest powiązana z platformą Xamarin.

00:19:26.905 --> 00:19:29.570
Jak mówiłeś, to może być
Subskrybowanie zdarzeń statycznych,

00:19:29.570 --> 00:19:32.745
mogłaby wprowadzić
problem nawet wszędzie.

00:19:32.745 --> 00:19:35.410
Więc następną rzeczą jest

00:19:35.410 --> 00:19:38.210
o subskrypcji, a
bez unsubscriptions.

00:19:38.210 --> 00:19:39.315
Ale w tym przypadku,

00:19:39.315 --> 00:19:42.820
jesteśmy rzeczywiście
Subskrybowanie niejawnie,

00:19:42.820 --> 00:19:44.480
nie używamy Plus równe.

00:19:44.480 --> 00:19:46.015
Więc trudniej znaleźć.

00:19:46.015 --> 00:19:48.710
W takim przypadku uruchamiamy Tę
Centrum powiadomień próbujących

00:19:48.710 --> 00:19:51.795
określić, kiedy nasza aplikacja jest obracana.

00:19:51.795 --> 00:19:53.695
Dodajemy w tym obserwatorze.

00:19:53.695 --> 00:19:57.525
Jest to centrum domyślne singleton.

00:19:57.525 --> 00:19:59.700
Mówimy, że chcę uzyskać

00:19:59.700 --> 00:20:02.595
wszelkie informacje, gdy
zmianie orientacji,

00:20:02.595 --> 00:20:04.140
i Oto mój program obsługi tego.

00:20:04.140 --> 00:20:04.650
>> Dostał.

00:20:04.650 --> 00:20:06.690
>> Sam program obsługi,
to dość proste.

00:20:06.690 --> 00:20:08.125
Nic nie zrobimy,

00:20:08.125 --> 00:20:11.665
będziemy po prostu wydrukować go do debugowania.

00:20:11.665 --> 00:20:12.465
>> Dostał.

00:20:12.465 --> 00:20:15.525
>> Pozwól mi usunąć
łączność, ponieważ

00:20:15.525 --> 00:20:18.630
chcemy wprowadzić różne
rodzaje pamięci problem.

00:20:18.630 --> 00:20:21.525
Komentuję również nasze
obraz, ponieważ nie potrzebujemy

00:20:21.525 --> 00:20:24.430
, aby wyświetlić pamięć
ślad, to tam jest.

00:20:24.430 --> 00:20:28.390
Będziemy eksperymentować tylko z
Kontrolery widoku interfejsu użytkownika i widoków.

00:20:28.390 --> 00:20:30.650
>> Bardzo fajne. Tak więc to
jest bardzo podobna,

00:20:30.650 --> 00:20:32.870
ale ten wzór,
mogą być subskrybowanie,

00:20:32.870 --> 00:20:34.605
może nawet przechodząc w akcji.

00:20:34.605 --> 00:20:38.340
Lub w tym przypadku, co robi
ono mówi tutaj ' Twój oddzwaniania.

00:20:38.340 --> 00:20:40.010
Delegaci są bardzo podobne,

00:20:40.010 --> 00:20:41.115
Myślę, że do tych wzorców.

00:20:41.115 --> 00:20:42.480
Więc to tylko coś
Jestem również używany.

00:20:42.480 --> 00:20:45.590
>> To prawda. To było

00:20:45.590 --> 00:20:47.864
ich główną ideą, ponieważ
Gdy subskrybujesz,

00:20:47.864 --> 00:20:51.405
Jesteś przekazując odniesienie do
Kontrolera widoku interfejsu użytkownika, jak również.

00:20:51.405 --> 00:20:53.425
Jest to tylko inna
sposób, aby przekazać odwołanie.

00:20:53.425 --> 00:20:55.260
Czasami nie jest to oczywiste.

00:20:55.260 --> 00:20:57.955
Mamy więc subskrypcję,
to działa tutaj.

00:20:57.955 --> 00:20:59.305
Jest uruchomiony tylko raz.

00:20:59.305 --> 00:21:01.780
Zamknijmy i otwórz go ponownie.

00:21:01.780 --> 00:21:03.525
Teraz mamy podwójne kliknięcie.

00:21:03.525 --> 00:21:05.230
Pozwól mi wyjaśnić, aby to pokazać.

00:21:05.230 --> 00:21:07.240
Obracając raz, dwa,

00:21:07.240 --> 00:21:11.655
co oznacza, że mamy widok interfejsu użytkownika
Kontroler wiszący w pamięci,

00:21:11.655 --> 00:21:13.535
przy dalszym przetwarzaniu pierwszego z nich.

00:21:13.535 --> 00:21:13.980
>> Dostał.

00:21:13.980 --> 00:21:15.430
>> Może to być problem, jeśli masz

00:21:15.430 --> 00:21:19.660
Niektóre logiki aktualizacji bazy danych
lub żądania HTTP w godzinach nadliczbowych.

00:21:19.660 --> 00:21:21.340
Jak w dzień użytkowania,

00:21:21.340 --> 00:21:24.810
Aplikacja nie zostanie zabita,
dezaktywować, ponownie aktywować.

00:21:24.810 --> 00:21:26.740
Będzie to miało
Zobacz jeszcze w pamięci,

00:21:26.740 --> 00:21:28.265
i w tygodniu, to może ulec awarii.

00:21:28.265 --> 00:21:28.785
>> tak.

00:21:28.785 --> 00:21:30.105
>> Więc jak to naprawić?

00:21:30.105 --> 00:21:31.550
To bardzo proste.

00:21:31.550 --> 00:21:34.145
>> Zakładam, że wypisać?

00:21:34.145 --> 00:21:35.835
>> To prawda. To jest trudniejsze do

00:21:35.835 --> 00:21:38.685
zrezygnować z subskrypcji, ponieważ
nie mają Plus równe.

00:21:38.685 --> 00:21:42.010
Pozwól mi pokazać również, co
faktycznie wysłać tutaj.

00:21:42.010 --> 00:21:43.365
Więc gdy subskrybujesz,

00:21:43.365 --> 00:21:46.395
Jesteś przekazanie nazwy metody.

00:21:46.395 --> 00:21:48.215
Jesteś faktycznie przechodzi akcję,

00:21:48.215 --> 00:21:51.745
i kompilator robi
wielkie zadanie ukrycia, że

00:21:51.745 --> 00:21:54.150
i uczynienie naszego życia łatwiejszym.

00:21:54.150 --> 00:21:55.945
>> Kompilator jest bardzo miły.

00:21:55.945 --> 00:21:57.255
>> Bardzo miło nam.

00:21:57.255 --> 00:22:00.415
Dlatego lubimy być programistami.

00:22:00.415 --> 00:22:04.360
Więc to rzeczywiście prosi o
akcję z NSNotification.

00:22:04.360 --> 00:22:07.840
Więc jestem podpisywania NSNotification tutaj,

00:22:07.840 --> 00:22:13.365
a następnie korzystając z tej notacji,
wklejenie tego obiektu.

00:22:13.365 --> 00:22:16.560
Zamiast nazwy metody

00:22:16.560 --> 00:22:19.225
jesteśmy rzeczywiście przechodzi
działanie i przedmiot,

00:22:19.225 --> 00:22:20.960
która zawiera odniesienie do

00:22:20.960 --> 00:22:23.610
metadane dotyczące
do wywołania metody.

00:22:23.610 --> 00:22:26.555
Więc nie zdajemy metody,
to tylko odniesienie.

00:22:26.555 --> 00:22:30.060
W naszym przypadku najważniejszym
część podczas przekazywania tego odniesienia,

00:22:30.060 --> 00:22:32.155
który jest kontrolerem UIV,

00:22:32.155 --> 00:22:34.170
i dlatego jest trzymane w pamięci.

00:22:34.170 --> 00:22:35.260
>> Dostał.

00:22:35.260 --> 00:22:35.865
>> Okay.

00:22:35.865 --> 00:22:36.670
>> Sens. Tak.

00:22:36.670 --> 00:22:38.595
>> Nie będę pokazywały szczegółów

00:22:38.595 --> 00:22:40.390
ponieważ pamięć
przecieku jest nadal

00:22:40.390 --> 00:22:43.975
ponieważ widzieliśmy te
coś zaoszczędzić trochę czasu.

00:22:43.975 --> 00:22:45.500
Chcę skupić się na

00:22:45.500 --> 00:22:48.830
najgorszego scenariusza, który
powinieneś być świadomy.

00:22:48.830 --> 00:22:54.250
Kiedy rodzimy świat nie ma miejsca
ładnie z zarządzanym światem.

00:22:54.250 --> 00:22:56.280
>> Masz. Po upływie
zderza się z dwoma światami.

00:22:56.280 --> 00:23:00.265
>> To jest poprawne, ponieważ gdy
stworzyliśmy obiekt zarządzany,

00:23:00.265 --> 00:23:02.155
i jest tworzony obiekt macierzysty,

00:23:02.155 --> 00:23:05.690
i próbuje
deallocate obiektów macierzystych,

00:23:05.690 --> 00:23:07.495
Nasz zarządzany świat myśli,

00:23:07.495 --> 00:23:09.330
Nie jestem jeszcze zrobione z tego obiektu.

00:23:09.330 --> 00:23:11.270
Proszę trzymać, nie

00:23:11.270 --> 00:23:13.765
zebrać obiekt, ponieważ
Nadal pracuję z tym.

00:23:13.765 --> 00:23:14.525
>> Masz.

00:23:14.525 --> 00:23:15.805
>> Może być odwrotnie,

00:23:15.805 --> 00:23:19.130
Kiedy rodzimy świat
może stworzyć obiekt,

00:23:19.130 --> 00:23:20.265
a teraz zarządzany świat myśli,

00:23:20.265 --> 00:23:22.450
to nie jest zrobione, nadal
tam, więc niech trzymać.

00:23:22.450 --> 00:23:25.015
Nawet jeśli nie masz innych
odniesienia do tego obiektu,

00:23:25.015 --> 00:23:29.015
może go trzymać, może
trzymać go nie jako śmieci.

00:23:29.015 --> 00:23:29.820
>> Masz.

00:23:29.820 --> 00:23:31.460
>> Mógłbym to wyjaśnić

00:23:31.460 --> 00:23:34.640
te małe mały obraz
nieśmiertelnych przedmiotów.

00:23:34.640 --> 00:23:37.230
Więc nie twórz nieśmiertelnego
Obiektów. Są złe.

00:23:37.230 --> 00:23:38.435
>> Brzmi fajnie.

00:23:38.435 --> 00:23:39.963
>> tak.

00:23:39.963 --> 00:23:43.355
Zdarza się, gdy
mają te dwa światy.

00:23:43.355 --> 00:23:46.925
Native, widzisz po prawej stronie
macierzystego kontrolera widoku i widoków,

00:23:46.925 --> 00:23:49.640
i od lewej masz

00:23:49.640 --> 00:23:52.580
zarządzanego świata C Sharp, który
Wyświetl kontrolery i widoki.

00:23:52.580 --> 00:23:55.640
Gdy nie wiesz, co jest
dzieje się na rodzimym świecie,

00:23:55.640 --> 00:23:58.070
nie można zbierać
go z tego świata.

00:23:58.070 --> 00:24:00.905
Pokażę Ci jeden przykład
jak możesz to zrobić.

00:24:00.905 --> 00:24:03.275
Więc w moim przykładzie,

00:24:03.275 --> 00:24:07.235
Chcę dodać tutaj małą
mały przycisk "Save",

00:24:07.235 --> 00:24:11.375
i po prostu chcesz zamknąć
Zobacz raz użytkownik uderza, że.

00:24:11.375 --> 00:24:13.925
Załóżmy, że
Przycisk "Save" będzie również

00:24:13.925 --> 00:24:17.330
Niektóre bazy danych logiki zapisywania
lub HTTP wywołuje cokolwiek,

00:24:17.330 --> 00:24:19.055
to po prostu nie wraca

00:24:19.055 --> 00:24:22.145
i faktycznie wykonuje
dodatkowe działania.

00:24:22.145 --> 00:24:22.775
>> Okay.

00:24:22.775 --> 00:24:24.980
>> Jako szczegóły tych przycisków,

00:24:24.980 --> 00:24:26.300
wysyłamy w obsłudze.

00:24:26.300 --> 00:24:31.205
Ten program obsługi mówi, że
należy zamknąć sterownik.

00:24:31.205 --> 00:24:33.395
>> Wygląda zupełnie uzasadnione do mnie.

00:24:33.395 --> 00:24:35.255
>> Tak. Wprowadzimy
przeciek pamięci.

00:24:35.255 --> 00:24:36.230
>> Okay.

00:24:36.230 --> 00:24:42.515
>> Jesteś zły. Będzie to niestety
i jest to wspólny wzór.

00:24:42.515 --> 00:24:45.005
Nie mamy żadnych
statyczne zdarzenia, takie jak tutaj.

00:24:45.005 --> 00:24:47.195
Nie mamy żadnych
jeden ton jak tutaj.

00:24:47.195 --> 00:24:49.025
Po prostu trzymamy ten przycisk tutaj,

00:24:49.025 --> 00:24:51.650
jest to tylko element lokalny.

00:24:51.650 --> 00:24:54.260
Okay James, teraz
utworzony przycisk i

00:24:54.260 --> 00:24:56.735
chcemy dodać go do
naszego widoku nawigacji.

00:24:56.735 --> 00:25:00.440
Tak powiedzieliśmy w nim przez
element nawigacyjny również nie używać

00:25:00.440 --> 00:25:05.225
wszelkie statyczne odniesienia nic
tak i tylko to.

00:25:05.225 --> 00:25:08.015
Teraz mamy przycisk sub
i zacznijmy Profiler.

00:25:08.015 --> 00:25:09.890
>> tak i znowu,
bardzo podobny wzór.

00:25:09.890 --> 00:25:11.285
Tworzę przycisk,

00:25:11.285 --> 00:25:15.800
dodać przycisk, a następnie pop
Kontroler widoku wydaje się normalne.

00:25:15.800 --> 00:25:18.185
>> Mieć delegata, który nie używa

00:25:18.185 --> 00:25:20.540
Wszelkie odniesienia zewnętrzne lub statyczne

00:25:20.540 --> 00:25:23.225
i nie przekazuje żadnych odwołań
z naszego kontrolera.

00:25:23.225 --> 00:25:23.750
>> Masz.

00:25:23.750 --> 00:25:27.090
>> Powinien działać dobrze,
Prawo? Zobaczmy.

00:25:27.280 --> 00:25:32.780
Więc Profiler pokaże obiekty

00:25:32.780 --> 00:25:34.760
stworzony na samym początku i jestem

00:25:34.760 --> 00:25:37.790
zamiar rozpocząć śledzenie
na samym początku.

00:25:37.790 --> 00:25:39.530
Więc mam ukryte migawki prawo

00:25:39.530 --> 00:25:42.455
teraz i filtrowanie tylko do moich obiektów.

00:25:42.455 --> 00:25:45.380
Znowu jest bardzo powszechne
wzorzec do rozwiązywania problemów

00:25:45.380 --> 00:25:48.800
Problemy z pamięcią tylko po to, aby
Zobacz tylko moje obiekty.

00:25:48.800 --> 00:25:52.235
Potem już tam jestem.
To jest mój guzik.

00:25:52.235 --> 00:25:55.565
Widzisz, jest to nowy formant
ładnie naszej aplikacji.

00:25:55.565 --> 00:25:56.870
Mamy to w pamięci,

00:25:56.870 --> 00:25:58.745
co jest prawdą, oczekujemy.

00:25:58.745 --> 00:26:03.410
Wracając, Let's hit jeden
więcej czasu i jeszcze raz.

00:26:03.410 --> 00:26:04.430
>> Jeszcze raz bo wiem.

00:26:04.430 --> 00:26:05.195
>> Jeszcze raz.

00:26:05.195 --> 00:26:06.380
>> Dobra, i jeszcze tam.

00:26:06.380 --> 00:26:08.270
>> Jeszcze raz, to nadal istnieje.

00:26:08.270 --> 00:26:11.030
Więc niech go otworzyć i wiele razy.

00:26:11.030 --> 00:26:14.090
Let's również zamknąć to
inny sposób wraca,

00:26:14.090 --> 00:26:17.390
zamiar zapisać, to faktycznie
w zasadzie robi to samo.

00:26:17.390 --> 00:26:20.090
Let's hit "pamięci
migawka "jeszcze jeden

00:26:20.090 --> 00:26:22.610
czas i oh wow my
mają pięć wystąpień

00:26:22.610 --> 00:26:24.920
stron wiszących w
pamięci i jeśli masz

00:26:24.920 --> 00:26:28.130
ogromny obraz tam
będzie miał dużo pamięci

00:26:28.130 --> 00:26:28.550
>> Dostał.

00:26:28.550 --> 00:26:32.615
>> Więc to bardzo wspólny wzór

00:26:32.615 --> 00:26:36.800
ponieważ nie jest oczywiste, że
masz przeciek pamięci tutaj.

00:26:36.800 --> 00:26:39.830
Problem tutaj jest
że UIBarButtonItem

00:26:39.830 --> 00:26:43.910
rzeczywiście trzyma się
niektórych zasobów macierzystych,

00:26:43.910 --> 00:26:45.485
jest powiązana z zasobem macierzystym.

00:26:45.485 --> 00:26:49.100
Jeśli nie mówimy jasno, że
Nie potrzebuję już tego przycisku,

00:26:49.100 --> 00:26:51.020
wprowadzi
tego nieśmiertelnego przedmiotu.

00:26:51.020 --> 00:26:53.135
>> Masz. Jak więc
Rozwiązuję tę rzecz?

00:26:53.135 --> 00:26:56.240
>> Aby rozwiązać ten problem, użyj

00:26:56.240 --> 00:26:59.900
Nasze zdarzenie Viewznikają i
zrobić coś z naszym przyciskiem.

00:26:59.900 --> 00:27:00.150
>> Okay.

00:27:00.150 --> 00:27:01.220
>> Więc mamy dwie opcje,

00:27:01.220 --> 00:27:02.735
moglibyśmy albo użyć

00:27:02.735 --> 00:27:05.299
Kliknięto zdarzenie i
subskrybować i anulować subskrypcję,

00:27:05.299 --> 00:27:07.160
ale wróci do

00:27:07.160 --> 00:27:10.400
Nasz pierwszy element, gdy subskrybujemy
bez wypisywania się.

00:27:10.400 --> 00:27:12.560
Zrobimy coś bardziej interesującego.

00:27:12.560 --> 00:27:14.030
Po prostu pozbędziemy się przycisku.

00:27:14.030 --> 00:27:15.680
>> Lubię to. Jestem
zrobić z nim, prawda?

00:27:15.680 --> 00:27:18.320
>> Tak, my rodzaju powiedzenie
zarządzanego świata, który

00:27:18.320 --> 00:27:20.495
"Skończysz z przyciskiem
należy go wyrzucić. "

00:27:20.495 --> 00:27:24.365
Nie jest oczywiste, ponieważ
wiele widoków i owijarek

00:27:24.365 --> 00:27:26.540
w Xamarin iOS mają
tej metody Dispose i

00:27:26.540 --> 00:27:29.015
naprawdę nie wiesz, kiedy
należy to nazwać.

00:27:29.015 --> 00:27:30.815
Więc to jest ciekawy przypadek.

00:27:30.815 --> 00:27:32.975
Ale niech to zrobić i niech uruchomić.

00:27:32.975 --> 00:27:34.700
To jedyna akcja, którą dodałem

00:27:34.700 --> 00:27:37.500
od czasu uruchomienia poprzedniej aplikacji.

00:27:38.290 --> 00:27:42.530
Zaczynam Profiler
i robi to samo przypadek użycia.

00:27:42.530 --> 00:27:44.000
Zamierzamy śledzić obiekty z

00:27:44.000 --> 00:27:46.310
samym początku i uczynić
upewnić się, że są usuwane.

00:27:46.310 --> 00:27:48.050
>> Bardzo fajne. To jest miłe.

00:27:48.050 --> 00:27:49.670
Więc można mieć, jak mówiłeś,

00:27:49.670 --> 00:27:53.270
zamiast przekazywania
że całe działanie w,

00:27:53.270 --> 00:27:55.130
można po prostu podobne do tego, jak

00:27:55.130 --> 00:27:57.605
czy łączność,
subskrybować, anulować subskrypcję,

00:27:57.605 --> 00:28:00.590
Ja bym to zorientowali
ale w tym przypadku

00:28:00.590 --> 00:28:03.125
Jesteś już to zrobił
po prostu wyrzucić.

00:28:03.125 --> 00:28:04.010
>> To prawda.

00:28:04.010 --> 00:28:04.875
>> Cool.

00:28:04.875 --> 00:28:08.455
>> tak, bo nie
oczekiwać, że zostanie cofniesubskrybowany.

00:28:08.455 --> 00:28:10.840
Nie jest to rodzaj abonamentu,

00:28:10.840 --> 00:28:14.230
po prostu przekazać i delegować
wewnątrz obiektu lokalnego.

00:28:14.230 --> 00:28:16.045
W przypadku NotificationCenter,

00:28:16.045 --> 00:28:18.790
to rodzaj subskrypcji, ponieważ
przechodzimy w lokalnym obiekcie

00:28:18.790 --> 00:28:21.760
do niektórych statycznych
wystąpienia lub singleton.

00:28:21.760 --> 00:28:24.760
W tym przypadku, po prostu użyliśmy
w naszych lokalnych zasobach,

00:28:24.760 --> 00:28:26.395
nie spodziewamy się przeciek pamięci.

00:28:26.395 --> 00:28:26.680
>> Masz.

00:28:26.680 --> 00:28:28.630
>> Ale niestety widzę

00:28:28.630 --> 00:28:32.660
Ta bariera dużo i ludzie
w takich sytuacjach.

00:28:32.680 --> 00:28:37.530
Więc przejdźmy do tej samej sztuczki.

00:28:37.750 --> 00:28:41.760
Życzę może zapisać te dane.

00:28:41.950 --> 00:28:46.310
Więc mamy tylko jeden widok
Kontroler i pełnomocnik.

00:28:46.310 --> 00:28:48.290
Let's hit "Zapisz".

00:28:48.290 --> 00:28:51.215
Wracajmy.

00:28:51.215 --> 00:28:54.005
Pozwólmy ' rzeczywiście pobyt przy bliższe dane stronica.

00:28:54.005 --> 00:28:56.975
Hit "migawka pamięci" i widzimy jeden.

00:28:56.975 --> 00:28:59.315
Pozwól mi kliknąć go jeszcze kilka razy.

00:28:59.315 --> 00:29:02.735
Porozmawiamy o tym. Dlatego
mieć tylko jedno wystąpienie tutaj.

00:29:02.735 --> 00:29:10.805
Klikam "Save", kliknij "snapshot"
i znika skanowanie.

00:29:10.805 --> 00:29:12.380
Okk? Naprawiono przeciek pamięci.

00:29:12.380 --> 00:29:13.250
>> Bardzo fajne. Ładne.

00:29:13.250 --> 00:29:14.900
>> Nieśmiertelny obiekt został zabity.

00:29:14.900 --> 00:29:16.445
>> Zabił. Bardzo fajne.

00:29:16.445 --> 00:29:17.810
W przeciwnym razie jest to niesamowite.

00:29:17.810 --> 00:29:20.600
Tak bardzo proste, spójrz na swoje wydarzenia,

00:29:20.600 --> 00:29:22.850
ale także spojrzeć na to, jak jesteś przechodząc

00:29:22.850 --> 00:29:24.890
te działania wokół, a nawet ja

00:29:24.890 --> 00:29:26.870
nawet nie myśleć o tym
przycisk, aby być uczciwym z Tobą

00:29:26.870 --> 00:29:29.315
ponieważ Konstruktor
przechodzi tę rzecz.

00:29:29.315 --> 00:29:29.600
>> Tak.

00:29:29.600 --> 00:29:30.725
>> Tak bardzo fajne.

00:29:30.725 --> 00:29:33.350
>> Polecam również

00:29:33.350 --> 00:29:36.425
naszych programistów, aby używać go bardziej
często lubić raz w tygodniu,

00:29:36.425 --> 00:29:39.545
każdego sprintu, a następnie
Zobacz Użycie pamięci,

00:29:39.545 --> 00:29:41.585
można go zobaczyć jako Uruchom test interfejsu użytkownika.

00:29:41.585 --> 00:29:45.590
To pokazuje ten mały
zestawu roboczego pamięci.

00:29:45.590 --> 00:29:48.050
Więc po prostu zobaczyć nad
miesięcy, jeśli rośnie lub

00:29:48.050 --> 00:29:51.530
nie i jeśli się rozwija
prawdopodobnie ma przeciek pamięci.

00:29:51.530 --> 00:29:53.360
>> Pokazał iOS.

00:29:53.360 --> 00:29:54.560
Teraz co około pod kątem Android?

00:29:54.560 --> 00:29:57.500
Czy istnieją szczególne inne
narzędzi, które można użyć?

00:29:57.500 --> 00:29:59.465
>> To wielkie pytanie
ponieważ, Android,

00:29:59.465 --> 00:30:02.000
wszystko, co rozmawialiśmy o
iOS dotyczy systemu Android.

00:30:02.000 --> 00:30:02.150
>> Masz.

00:30:02.150 --> 00:30:03.440
>> Wystarczy inne narzędzie do

00:30:03.440 --> 00:30:07.145
Natywny Profiler systemu Android
o nazwie Android Profiler.

00:30:07.145 --> 00:30:08.390
To jest naprawdę fajne.

00:30:08.390 --> 00:30:09.740
To pokazuje wiele

00:30:09.740 --> 00:30:12.380
informacje, ale nadal masz
używać go, który jest

00:30:12.380 --> 00:30:14.330
Profiler Xamarin w połączeniu

00:30:14.330 --> 00:30:16.790
z powodu zarządzanych
świecie i rodzimym świecie.

00:30:16.790 --> 00:30:17.930
>> Masz. To po prostu

00:30:17.930 --> 00:30:19.340
brzmi to było fajne, że
tam ' wielki narzędzia

00:30:19.340 --> 00:30:22.400
dostępne bez względu na to, gdzie
Jesteś na, iOS, Android.

00:30:22.400 --> 00:30:23.240
>> To jest poprawne.

00:30:23.240 --> 00:30:24.005
>> Mogę iść dalej i to zrobić.

00:30:24.005 --> 00:30:25.820
Szczerze mówiąc, po prostu patrząc
w niektórych z nich,

00:30:25.820 --> 00:30:28.160
Jestem pewien, że mój kod,
jest wiele złych rzeczy.

00:30:28.160 --> 00:30:29.480
Więc kiedy strumień dalej,

00:30:29.480 --> 00:30:31.790
to będzie wszystko
Naprawianie przecieków pamięci.

00:30:31.790 --> 00:30:32.180
>> Okay.

00:30:32.180 --> 00:30:34.280
>> Bardzo fajne. Cokolwiek innego Alexi
o której chcesz rozmawiać?

00:30:34.280 --> 00:30:35.315
>> Że wszystko na dziś.

00:30:35.315 --> 00:30:37.865
>> Awesome. Cóż, dzięki
wszystkich do strojenia.

00:30:37.865 --> 00:30:40.010
Alexi, dziękuję bardzo za
pokazując wszystkie te rzeczy.

00:30:40.010 --> 00:30:42.305
>> Dziękuję chłopaki. Dziękuję
Ci James za poinformowanie mnie.

00:30:42.305 --> 00:30:43.970
>> Absolutnie, i upewnij się,

00:30:43.970 --> 00:30:45.920
sprawdzić wszystkie
Poniższe uwagi pokazują,

00:30:45.920 --> 00:30:47.420
otworzyć wszystkie źródła
kod, wszystkie linki

00:30:47.420 --> 00:30:48.980
dokumentacji.

00:30:48.980 --> 00:30:51.740
Można również przejść do aka.ms/Xamarin

00:30:51.740 --> 00:30:54.485
najlepszych praktyk dla całej serii.

00:30:54.485 --> 00:30:55.790
Więc upewnij się, że Subskrybuj

00:30:55.790 --> 00:30:57.695
dziś gdziekolwiek jesteś
oglądania w tej chwili.

00:30:57.695 --> 00:30:59.090
Jestem James Montemagno.

00:30:59.090 --> 00:31:01.790
To było Xamarin
Pokaż i Dziękujemy za oglądanie.

00:31:01.790 --> 00:31:02.480
>> Dziękuję chłopaki.

00:31:02.480 --> 00:31:09.230
MUZYKI

00:31:09.230 --> 00:31:11.120
>> Hej, Jakub tutaj.
Po prostu chciałem się zameldować

00:31:11.120 --> 00:31:13.175
i dziękuję za
oglądania tego filmu.

00:31:13.175 --> 00:31:16.265
Teraz rób wszystkie rzeczy, które
wiesz, że chcesz robić jak lubisz,

00:31:16.265 --> 00:31:18.710
Subskrybuj i Ding
tego dzwonka powiadomień,

00:31:18.710 --> 00:31:20.825
stać się częścią
oddziału zgłoszeniami.

00:31:20.825 --> 00:31:22.190
Gdy jesteś tutaj, sprawdź

00:31:22.190 --> 00:31:25.400
wszystkie te niesamowite filmy
że już zakodowałem.

00:31:25.400 --> 00:31:29.040
Kliknij na to coś. Kliknij
go obejrzeć, to zrobić.

