WEBVTT

00:00:00.000 --> 00:00:01.680
>> 今週の曲がります
ザマリンショーどこ

00:00:01.680 --> 00:00:03.360
話す上で私の良い友人アレクシ

00:00:03.360 --> 00:00:06.810
のメモリ管理について
あなたのアプリケーション。だから、チューニング。

00:00:06.810 --> 00:00:13.200
[音楽]

00:00:13.200 --> 00:00:14.280
>> お帰りなさい、みんな、

00:00:14.280 --> 00:00:15.405
ザマリンショーに。

00:00:15.405 --> 00:00:16.650
私はあなたのホストジェームズ・モンテマーニョです。

00:00:16.650 --> 00:00:17.820
今日、私の親友は

00:00:17.820 --> 00:00:21.270
アレクシとの全世界
私。調子はどうだ?

00:00:21.270 --> 00:00:22.905
>> 私は良いです。あなたはどうですか。

00:00:22.905 --> 00:00:24.960
>> 私は素晴らしい仕事をしています。
すばらしい日です

00:00:24.960 --> 00:00:26.640
ここレドモンド、ワシントンで毎日。

00:00:26.640 --> 00:00:27.325
>>です。

00:00:27.325 --> 00:00:29.085
>> 今、あなたは私たちの携帯電話から

00:00:29.085 --> 00:00:31.065
顧客アドバイザリ
チーム、それは正しいですか?

00:00:31.065 --> 00:00:31.920
>> そのは正しい。

00:00:31.920 --> 00:00:33.450
>> どういう意味?

00:00:33.450 --> 00:00:35.370
>> それは私たちが一緒に働くことを意味します

00:00:35.370 --> 00:00:38.250
私たちのクライアントと私たち
明らかに彼らに助言する。

00:00:38.250 --> 00:00:41.645
しかし、ほとんどの場合、開発者と協力しています
そして、彼らがツールを使用する方法を参照してください。

00:00:41.645 --> 00:00:44.300
彼らは私たちのXamarinツールで動作する方法、

00:00:44.300 --> 00:00:47.560
そして、一般的なものは何ですか
彼らが直面する落とし穴。

00:00:47.560 --> 00:00:48.420
>> 完璧。

00:00:48.420 --> 00:00:50.205
>> 今日、私はについて話したい

00:00:50.205 --> 00:00:52.355
そのうちの1つはメモリ管理です。

00:00:52.355 --> 00:00:53.780
>> あなたを得た。はい。それは非常に重要です

00:00:53.780 --> 00:00:55.730
私たちはよく話すので
すべてのクールについて、

00:00:55.730 --> 00:00:57.155
あなたが行うことができる派手な機能、

00:00:57.155 --> 00:01:00.440
しかし、私たちはこれを持っていたかった
ベスト プラクティス シリーズ

00:01:00.440 --> 00:01:02.340
あなたがトラブルに巻き込まれるからです。

00:01:02.340 --> 00:01:03.820
それは起こる。それはとても簡単です。

00:01:03.820 --> 00:01:06.345
メモリ管理,
正直なところ、私はノブです。

00:01:06.345 --> 00:01:07.770
私は本当に知らない。私はちょうど同じように、

00:01:07.770 --> 00:01:09.560
「彼らは殺すつもりだ
5秒で私のアプリ。

00:01:09.560 --> 00:01:11.705
どうでもいいでしょ?だがしかし
そんな風に考えるべきではない。

00:01:11.705 --> 00:01:14.210
>> それは本当です。それは私たちが見るものです

00:01:14.210 --> 00:01:16.850
誰も気にしないので
メモリ管理。

00:01:16.850 --> 00:01:21.300
私たちはたくさんの記憶を持っている
そして、あなたはそれらをチェックすることはありません。

00:01:21.300 --> 00:01:24.750
最後に君が最後だったのはいつだ
アプリのメモリ使用量を確認しましたか?

00:01:24.750 --> 00:01:26.250
>> 最後にクラッシュした時。

00:01:26.250 --> 00:01:29.510
実は、私は非常に持っていた
この良い例。

00:01:29.510 --> 00:01:31.910
これを教えてあげよう。これ
は実世界の例です。

00:01:31.910 --> 00:01:35.120
私はザマリンエッセンシャルズでバグを得た

00:01:35.120 --> 00:01:38.375
私が電話するときと言う
この方法は20,000回、

00:01:38.375 --> 00:01:41.570
私のアプリがクラッシュし、それ
私がいなかったから

00:01:41.570 --> 00:01:45.155
を適切に処分する
ネイティブアンドロイドオブジェクト,

00:01:45.155 --> 00:01:46.775
ウィンドウ、ディスプレイ。

00:01:46.775 --> 00:01:48.170
だから、何が起こっているのか、

00:01:48.170 --> 00:01:50.480
私はそれを作成し続けるだろう
そして、それは決して得られないだろう

00:01:50.480 --> 00:01:53.135
なぜなら、今までに収集されたゴミ
私はそれを決して処分しませんでした。

00:01:53.135 --> 00:01:54.890
>> それは私たちが行くものです
今日の話をする。

00:01:54.890 --> 00:01:56.925
>> はい。すごい。やろう
それ。あなたは私たちに何を持っていますか?

00:01:56.925 --> 00:02:00.435
>> だから、私たちはこの小さいを持っています
2つのウィンドウを持つシンプルなアプリ、

00:02:00.435 --> 00:02:02.745
メイン画面と詳細画面。

00:02:02.745 --> 00:02:06.375
それは非常に一般的なパターンです
UI ナビゲーション コントローラー。

00:02:06.375 --> 00:02:09.600
これは平野のザマリンです
iOSアプリケーションでしょ?

00:02:09.600 --> 00:02:10.305
>> わかった。

00:02:10.305 --> 00:02:12.440
>> 私たちが行くもの
行うことは導入する

00:02:12.440 --> 00:02:14.930
多くのメモリリーク、
多くの異なる方法。

00:02:14.930 --> 00:02:19.025
しかし、まず、私はについて話したい
ネイティブの世界との違い

00:02:19.025 --> 00:02:23.960
そして管理された世界
パフォーマンスとメモリ。

00:02:23.960 --> 00:02:25.340
だから、プロセスがあるときはいつでも、

00:02:25.340 --> 00:02:27.995
オペレーティング システムの与える
メモリ チャンクを使用します。

00:02:27.995 --> 00:02:31.370
あなたはそれについて気づくべきです
メモリが不足すると、

00:02:31.370 --> 00:02:33.670
アプリがクラッシュするか、
オペレーティングシステムはそれを殺します。

00:02:33.670 --> 00:02:35.355
マネージ メモリでは、

00:02:35.355 --> 00:02:40.260
私たちのシャマリンモノは、これらを得る
このメモリの小さな部分。

00:02:40.260 --> 00:02:41.630
そういう時は、私たちはそうするべき時です。

00:02:41.630 --> 00:02:43.670
私たちがどのように慎重に
その作品も使用してください。

00:02:43.670 --> 00:02:44.030
>> わかった。

00:02:44.030 --> 00:02:46.640
>> だから、あなたはまだあるべきです
ネイティブ メモリに関する認識、

00:02:46.640 --> 00:02:48.905
そして今、あなたはXamarinと一緒に働いたら、

00:02:48.905 --> 00:02:50.320
また、管理部分についても認識しています。

00:02:50.320 --> 00:02:52.740
>> わかった。だから、あなたは持っている
ネイティブ メモリ, iOS,

00:02:52.740 --> 00:02:55.980
アンドロイドビットとピース,
.NET マネージ メモリ?

00:02:55.980 --> 00:02:56.640
>> そうですね。

00:02:56.640 --> 00:02:57.090
>> 完璧。

00:02:57.090 --> 00:03:00.530
>> オブジェクトを作成するたびに
そして、あなたが作成すると、例えば、

00:03:00.530 --> 00:03:02.330
UI ボタンを実際に作成する

00:03:02.330 --> 00:03:04.950
ネイティブ UI ボタンと
マネージ UI ボタン クラス。

00:03:04.950 --> 00:03:06.680
メモリへの影響は異なります。

00:03:06.680 --> 00:03:10.310
彼らは異なる原因となる可能性がある
メモリの問題がある

00:03:10.310 --> 00:03:14.135
また、収集するネイティブな方法
ゴミと管理された方法。

00:03:14.135 --> 00:03:20.385
モノラルでは、モノラルシングルを使用しています
生成ガベージ コレクタ。

00:03:20.385 --> 00:03:23.460
ネイティブの世界では、iOS は ARC を使用します。

00:03:23.460 --> 00:03:26.680
アンドロイドは、独自のを使用します
ガベージ コレクタ,

00:03:26.680 --> 00:03:29.420
しかし、彼らは一緒に働くべきです
並んで、私たちはすべきです

00:03:29.420 --> 00:03:32.300
あなたができるので、それらを持っています
それを使用して問題を導入します。

00:03:32.300 --> 00:03:32.690
>> わかった。

00:03:32.690 --> 00:03:34.640
>> 最初のと

00:03:34.640 --> 00:03:36.950
導入する最も簡単なアプローチ

00:03:36.950 --> 00:03:40.830
メモリの問題はサブスクリプションです
サブスクリプション解除なし。

00:03:42.040 --> 00:03:45.680
ガベージ コレクターは知っておくべきです。
ゴミがあるとき。

00:03:45.680 --> 00:03:47.180
しかし、どうして彼は知ることができるのだろうか?

00:03:47.180 --> 00:03:49.565
ビルドできるはずです

00:03:49.565 --> 00:03:53.915
到達可能性ツリーグラフ
そして、それはルートから始まります。

00:03:53.915 --> 00:03:57.320
私たちの静的イベント、静的変数、

00:03:57.320 --> 00:03:59.350
静的イベントまたはスレッド ロール呼び出し、

00:03:59.350 --> 00:04:01.910
それらはすべて到達可能なルートであり、

00:04:01.910 --> 00:04:05.005
ガベージ コレクタが処理する
ゴミではないものとしてそれらを。

00:04:05.005 --> 00:04:06.810
だから、あなたがこのように購読するたびに、

00:04:06.810 --> 00:04:09.560
接続プラグインを取りましょう。

00:04:09.560 --> 00:04:11.960
分かってる、ジェームズ、お前は
このプラグインに精通しています。

00:04:11.960 --> 00:04:13.400
>> 私はそうです。はい。非常にそう。

00:04:13.400 --> 00:04:14.960
私はそれが好きです。インチ
ここで、我々はちょうど何ですか?

00:04:14.960 --> 00:04:16.220
イベントのサブスクライブ

00:04:16.220 --> 00:04:18.610
そして、それは任意の可能性があります
クリックイベントのようなイベント、

00:04:18.610 --> 00:04:20.360
センサー交換イベントがあります。

00:04:20.360 --> 00:04:22.715
基本的には、.NET でこれまでに何でも。

00:04:22.715 --> 00:04:25.970
>> はい。それは特定の
ザマリンだけじゃない

00:04:25.970 --> 00:04:27.830
これは、任意の静的なイベントです

00:04:27.830 --> 00:04:31.745
NET と接続で
ここではほんの一例です。

00:04:31.745 --> 00:04:35.390
私が言おうとしていることは、それ
任意の静的イベントまたは

00:04:35.390 --> 00:04:38.960
任意のシングルトン提供イベント。

00:04:38.960 --> 00:04:40.880
だから、私たちがそのような購読をするたびに、

00:04:40.880 --> 00:04:42.520
そして、私たちが持っているとしましょう

00:04:42.520 --> 00:04:47.100
のこの小さな小さな部分
接続性が変更されたハンドラーです。

00:04:47.100 --> 00:04:49.655
小さなメモリリークを導入します。

00:04:49.655 --> 00:04:54.290
私たちの見解は小さいので、それは小さいです
かなりシンプルで軽量、

00:04:54.290 --> 00:04:55.400
しかし、それはメモリリークです。

00:04:55.400 --> 00:04:57.685
>> だから、それはメモリリーク、なぜですか?

00:04:57.685 --> 00:05:00.860
>> この接続性と

00:05:00.860 --> 00:05:03.830
接続変更イベント
は静的参照です

00:05:03.830 --> 00:05:05.270
私たちのガベージコレクターのために。

00:05:05.270 --> 00:05:06.980
一度私たちのゴミ
コレクターがしようとしています

00:05:06.980 --> 00:05:08.810
それがゴミであるかどうかを識別し、

00:05:08.810 --> 00:05:11.015
それは理由ではない

00:05:11.015 --> 00:05:14.540
接続変更イベントには、
このハンドラへの参照

00:05:14.540 --> 00:05:17.375
そして、このハンドラは実際に処理します

00:05:17.375 --> 00:05:21.080
私たちの参照
詳細ビュー コント ローラー。

00:05:21.080 --> 00:05:24.680
>> なるほど。手に入れました。だから、私たちは
の内部にこのイベントを作成しました。

00:05:24.680 --> 00:05:29.600
このビューコントローラと私は
サブスクライブされていますが、サブスクライブ解除は行ありません。

00:05:29.600 --> 00:05:31.970
だから、それは常にこれを持っています
すぐに参照します。

00:05:31.970 --> 00:05:34.940
だから、ガベージコレクターは言う、
「ねえ、何が手に入るの?

00:05:34.940 --> 00:05:37.030
「そんなものは持てない」と言う。

00:05:37.030 --> 00:05:38.205
>> そのは正しい。

00:05:38.205 --> 00:05:40.580
>> 私はそれを確認したい
それは私がするので、それは正しいです

00:05:40.580 --> 00:05:42.185
そういう方法だと信じて
それは私の心の中で動作します。

00:05:42.185 --> 00:05:43.150
私は自分が正しいことを確かめたいと思う。

00:05:43.150 --> 00:05:47.225
>> 単一タスクガベージコレクタ
は、メモリの割り当てを解除することです。

00:05:47.225 --> 00:05:48.605
そして、それを適切に行うために、

00:05:48.605 --> 00:05:50.540
ガベージ コレクターは、

00:05:50.540 --> 00:05:52.730
次の場合に適切に識別する
ゴミかゴミかだ

00:05:52.730 --> 00:05:53.180
>> わかった。

00:05:53.180 --> 00:05:55.790
>> 到達可能性ツリーを構築するには、

00:05:55.790 --> 00:05:59.270
ガベージ コレクタ
静的ルートを使用するか、

00:05:59.270 --> 00:06:01.430
ルートと静的イベントのみ

00:06:01.430 --> 00:06:03.500
または任意の静的プロパティ
ルートの 1 つとして。

00:06:03.500 --> 00:06:06.460
また、ローカル変数、
他のものの多く。

00:06:06.460 --> 00:06:07.020
>> わかった。

00:06:07.020 --> 00:06:11.820
>> だから私はそれを実行させてください
そして、それがどのように動作するかを示しています。

00:06:11.820 --> 00:06:14.745
私たちがそうすると思いますか
違いが見える?

00:06:14.745 --> 00:06:17.540
>> 分からない。私が言いたいのは
うまくいけば、理由ではない

00:06:17.540 --> 00:06:20.090
それはとても簡単です私が考えているものです。

00:06:20.090 --> 00:06:22.160
さて、私の恐怖は、

00:06:22.160 --> 00:06:24.200
私たちは上に登録しているので
そして何度も何度も、

00:06:24.200 --> 00:06:26.750
イベントを変更する場合は、

00:06:26.750 --> 00:06:28.850
私たちはおそらく得ている
多くのイベントで。

00:06:28.850 --> 00:06:30.635
>> はい。検証してみましょう。

00:06:30.635 --> 00:06:33.560
だから私は詳細ページに移動しました。

00:06:33.560 --> 00:06:36.185
今すぐ Wi-Fi を切断します。

00:06:36.185 --> 00:06:38.510
>> ここでは、使用しています
iOS シミュレーター。

00:06:38.510 --> 00:06:41.975
だから、実際に使用している
マシンのインターネット。

00:06:41.975 --> 00:06:46.460
>> はい。私たちはここでイベントを得たばかりです
これは接続変更です。

00:06:46.460 --> 00:06:51.910
何度か戻ろう
そして、さらに数回、

00:06:51.910 --> 00:06:54.630
そして、私はメインページに戻っています。

00:06:54.630 --> 00:06:58.215
私は繊細ではない
今は何でも

00:06:58.215 --> 00:07:01.280
そして、私は私の詳細を仮定します
ページはもうそこにありませんよね?

00:07:01.280 --> 00:07:01.430
>> はい。

00:07:01.430 --> 00:07:02.810
>> 私のサブスクリプションハンドラ

00:07:02.810 --> 00:07:04.805
なぜなら、うまくいくはならない
なにもしませんでした。

00:07:04.805 --> 00:07:07.015
Wi-Fi をオンにしましょう。

00:07:07.015 --> 00:07:09.510
>> わかった。だから私たちは実際に作成しました

00:07:09.510 --> 00:07:11.910
この接続変更
を 2 ページ目に表示します。

00:07:11.910 --> 00:07:12.420
>> 2ページ目。

00:07:12.420 --> 00:07:13.665
>> さて、私は最初のページにいます。

00:07:13.665 --> 00:07:17.440
>> はい。だから私たちは期待していません
動作する私たちのハンドラ、

00:07:17.440 --> 00:07:18.645
しかし、私たちが得たものを見てください。

00:07:18.645 --> 00:07:21.090
私たちはちょうど4つのハンドラを持っていました
コードの実行、

00:07:21.090 --> 00:07:23.600
そして、それは任意の可能性があります
データベースを更新するコード,

00:07:23.600 --> 00:07:25.505
何でも、設定を保存します。

00:07:25.505 --> 00:07:28.070
ここでの問題だけでなく、
メモリ管理を使用する

00:07:28.070 --> 00:07:30.635
それはいくつかのメモリを取るので。

00:07:30.635 --> 00:07:34.970
それはまた、我々が持っているので、問題
実行するコードもあります。

00:07:34.970 --> 00:07:37.445
>> それじま、それは意味する
[詳細] ページ

00:07:37.445 --> 00:07:39.350
今、それは決してできない
ゴミを回収?

00:07:39.350 --> 00:07:42.455
だから今、私はちょうどこれを持っている
詳細ページは常にメモリ内にあります。

00:07:42.455 --> 00:07:43.400
>> 残念ながら、はい。

00:07:43.400 --> 00:07:44.660
>> ああ、私の良さ、それは悪いです。

00:07:44.660 --> 00:07:47.385
>> それは悪いです。開発者として、

00:07:47.385 --> 00:07:49.560
私たちは常にそれを見るとは限りません。

00:07:49.560 --> 00:07:54.280
ユーザーとして、アプリがクラッシュする
週に一度のように、何でも。

00:07:54.280 --> 00:07:56.675
私はちょうどそれを再起動します
をクリックし、引き続き使用します。

00:07:56.675 --> 00:07:58.220
そういうわけで、それは報告されていません

00:07:58.220 --> 00:08:00.350
それはあまり真剣に受け止められていない

00:08:00.350 --> 00:08:03.950
しかし、それは特にあなたがした場合の問題です

00:08:03.950 --> 00:08:08.330
そこに巨大なイメージを得る
それはあなたの記憶に影響を与えます。

00:08:08.330 --> 00:08:10.910
だから私はコメントを解除するつもりです
このコード行

00:08:10.910 --> 00:08:14.680
これは実際にいくつかのメモリ負荷を追加します

00:08:14.680 --> 00:08:19.740
ここで、それはロードしています
インターネットからのイメージ。

00:08:19.740 --> 00:08:22.265
私たちはランダムなイメージを撮っているだけです。

00:08:22.265 --> 00:08:24.815
それは本当にランダムであることを示しましょう。

00:08:24.815 --> 00:08:27.035
ここで何が起こるか見てみましょう。

00:08:27.035 --> 00:08:29.510
私はいつも心配です。

00:08:29.510 --> 00:08:32.210
大丈夫です。だから、私たちは、このランダムなイメージを持っている、

00:08:32.210 --> 00:08:34.370
そして、それが私たちなのです
に読み込む

00:08:34.370 --> 00:08:37.190
私たちは毎回私たちのアプリ
[詳細] ページに移動します。

00:08:37.190 --> 00:08:37.610
>> わかった。

00:08:37.610 --> 00:08:40.395
>> こっちに見せてあげよう。

00:08:40.395 --> 00:08:42.970
>> これは完全に何かです
いつも何が起こるかだよね?

00:08:42.970 --> 00:08:45.220
[詳細] ページに移動するため、

00:08:45.220 --> 00:08:46.740
おそらくいくつかの情報を読み込みます。

00:08:46.740 --> 00:08:48.080
いくつかを引っ張っているかもしれない
からの情報

00:08:48.080 --> 00:08:51.095
その画面上のデータベース、
そして、それは悪いかもしれません。

00:08:51.095 --> 00:08:53.930
>> 自分を想像してみて
Instagramアプリを使用しています。

00:08:53.930 --> 00:08:55.330
そこに詳細ページがあります。

00:08:55.330 --> 00:08:56.710
タップしてフォローし、

00:08:56.710 --> 00:08:58.435
詳細に行く、戻って行く。

00:08:58.435 --> 00:09:00.720
別のフォルダを確認し、
詳細に入る,

00:09:00.720 --> 00:09:03.920
戻って、1週間であなたのアプリ
クラッシュし、誰も理由を知らない。

00:09:03.920 --> 00:09:06.680
それはメモリの問題のときです
遊びに来るかもしれない。

00:09:06.680 --> 00:09:09.180
>> あなたを得た。

00:09:09.180 --> 00:09:11.855
>> 私はあなたにそれを見せない
メモリリークはまだそこにあります

00:09:11.855 --> 00:09:14.650
私は見せたいので
プロファイラーは、

00:09:14.650 --> 00:09:16.375
これらの問題を特定する方法。

00:09:16.375 --> 00:09:17.800
これらの問題を特定するには、

00:09:17.800 --> 00:09:19.990
あなたはいくつかのツールを持っています。

00:09:19.990 --> 00:09:23.350
まず第一に、それはネイティブツールです。
iOは楽器を提供し、

00:09:23.350 --> 00:09:25.520
2つ目は管理ツールで、

00:09:25.520 --> 00:09:27.005
これは、ザマリンプロファイラーです。

00:09:27.005 --> 00:09:27.990
>> あなたを得た。

00:09:27.990 --> 00:09:29.520
>> なぜ両方が必要だと思いますか?

00:09:29.520 --> 00:09:32.985
>> まあ、彼らは別のことをします。

00:09:32.985 --> 00:09:36.090
>> はい。実際
このイメージのため。

00:09:36.090 --> 00:09:38.025
覚えて。私はそれについて話していました。

00:09:38.025 --> 00:09:41.565
彼らは実際に知ることができます
それ自身の部分について。

00:09:41.565 --> 00:09:44.190
だから、ザマリンプロファイラーは何も知らない

00:09:44.190 --> 00:09:47.100
メモリネイティブについて
そこで作成されたオブジェクト、

00:09:47.100 --> 00:09:50.010
ネイティブインストゥルメントは
マネージ メモリについて知る。

00:09:50.010 --> 00:09:52.685
ただ、いくつかあると言うだけ
作成されたオブジェクトのチャンク。

00:09:52.685 --> 00:09:54.710
モノラルがオブジェクトを作成すると、

00:09:54.710 --> 00:09:57.275
それはまだ何らかの形でそれをバインドします
をネイティブ オブジェクトに変更します。

00:09:57.275 --> 00:09:59.210
だから、あなたが見ることができるものは、

00:09:59.210 --> 00:10:00.500
しかし、残りはすべてそうはなりません。

00:10:00.500 --> 00:10:01.220
>> わかった。クール。

00:10:01.220 --> 00:10:02.945
>> それでは、ザマリンプロファイラーを見てみましょう。

00:10:02.945 --> 00:10:06.550
理解する方が簡単です
最初に、

00:10:06.550 --> 00:10:10.955
そして、それはまた、あなたに素敵な示しています
名前空間と名前付けが似ています。

00:10:10.955 --> 00:10:12.815
したがって、オブジェクトを識別できます。

00:10:12.815 --> 00:10:16.715
小さなボタン「実行」があります
ここの「プロフィールの開始」をクリックしてください。

00:10:16.715 --> 00:10:20.050
エンタープライズが必要
それを行うためのライセンス。

00:10:20.050 --> 00:10:23.870
しかし、それは非常に便利で、
私はあなたにそうすることを勧める。

00:10:23.870 --> 00:10:25.190
一度それをしたら

00:10:25.190 --> 00:10:26.825
それは実際にでアプリを構築します

00:10:26.825 --> 00:10:31.130
いくつかの追加のメタデータと
アプリに埋め込まれたコード。

00:10:31.130 --> 00:10:33.580
だから私たちは見ることができました
オブジェクトを追跡します。

00:10:33.580 --> 00:10:36.140
>> 今、この間に一つのこと
を構築し、展開しています。

00:10:36.140 --> 00:10:38.030
私たちは上で走っています
それを意味するシミュレータ

00:10:38.030 --> 00:10:40.520
この完全な馬力を持っています。

00:10:40.520 --> 00:10:45.320
私がそれをやっているのは大丈夫ですか
そして、私のデバイス上でそれをプロファイリングし、

00:10:45.320 --> 00:10:49.150
またはでそれを行う方が良いですか?
例えば、物理的なiPhone?

00:10:49.150 --> 00:10:50.570
>> それはあなただから良い質問です

00:10:50.570 --> 00:10:52.340
では、さまざまな種類のプロファイリングを実行できます。

00:10:52.340 --> 00:10:52.940
>> 興味深い。

00:10:52.940 --> 00:10:54.230
>> CPU をプロファイリングしている場合は、

00:10:54.230 --> 00:10:56.480
それは良い考えではない
シミュレータでそれを行うには

00:10:56.480 --> 00:10:58.820
あなたが持っていないので、
デバイスのフルパワー。

00:10:58.820 --> 00:11:01.340
しかし、あなたがメモリをやっている場合
プロファイラーと割り当て,

00:11:01.340 --> 00:11:04.355
あなたは同じ問題を得るでしょう
シミュレータとデバイス上で。

00:11:04.355 --> 00:11:04.730
>> 完璧。

00:11:04.730 --> 00:11:10.300
>>私はラップトップでそれを行うのが好き
それはちょうどより速く起動するので。

00:11:10.300 --> 00:11:13.010
コードを変換しません。

00:11:13.010 --> 00:11:16.085
ネイティブの命令に、ちょうど
をシミュレートし、即座に実行します。

00:11:16.085 --> 00:11:18.470
したがって、メモリプロファイリングを行うたびに、

00:11:18.470 --> 00:11:20.180
アプリを何度も実行する場合は、

00:11:20.180 --> 00:11:23.045
だから、あなたはそれを好きになるでしょう。

00:11:23.045 --> 00:11:25.085
同じテストをさせてください。

00:11:25.085 --> 00:11:27.980
だから、私は一度詳細ページを開いた、

00:11:27.980 --> 00:11:29.840
そして、あなたはここにこの小さなピークを参照してください。

00:11:29.840 --> 00:11:33.590
それは、私たちが私たちの増加したことを意味します
メモリ使用量が大幅に多い。

00:11:33.590 --> 00:11:35.915
しかし、あなたはこれを見ていない
ここでメモリを増加させます。

00:11:35.915 --> 00:11:38.510
それはまだ最大のオブジェクトのようなものです

00:11:38.510 --> 00:11:40.730
システムツリーとここのどこか。

00:11:40.730 --> 00:11:43.155
もう数回やらせてください。

00:11:43.155 --> 00:11:45.815
もう一度増やします。

00:11:45.815 --> 00:11:47.610
ここにスパイクが表示されます。

00:11:47.610 --> 00:11:49.735
しかし、ここではスパイクは表示しません。

00:11:49.735 --> 00:11:53.330
つまり、割り当て時
ネイティブメモリ内の何かで、

00:11:53.330 --> 00:11:56.220
それは反映しない
それは管理された世界で、

00:11:56.220 --> 00:11:59.419
しかし、私たちは合計メモリが
成長し、割り当て解除しない、

00:11:59.419 --> 00:12:00.720
これは最も重要なことです。

00:12:00.720 --> 00:12:01.455
>> なるほど。

00:12:01.455 --> 00:12:04.015
>> このスナップショットを使用して戻ってきました。

00:12:04.015 --> 00:12:05.710
メモリ スナップショットが実際に実行される

00:12:05.710 --> 00:12:07.875
ガベージ コレクション
を管理下のサイトで行います。

00:12:07.875 --> 00:12:10.195
したがって、このスナップショットを実行します。
私は別のものをやります。

00:12:10.195 --> 00:12:11.755
後で説明します。

00:12:11.755 --> 00:12:14.500
ファイナライズキューに対処します。

00:12:14.500 --> 00:12:17.475
しかし、基本的には、今ではきれいな記憶です。

00:12:17.475 --> 00:12:19.605
私たちは、それを確認します
私たちのガベージコレクター

00:12:19.605 --> 00:12:22.270
既に実行され、割り当て解除
取得されたすべてのオブジェクト。

00:12:22.270 --> 00:12:23.920
私たちはまだそこに思い出を見る。

00:12:23.920 --> 00:12:25.845
だから、それはまだダウンしました。

00:12:25.845 --> 00:12:28.755
ここで何が起こっているのかを知るために、

00:12:28.755 --> 00:12:32.005
私たちはただここに行って、
フィルタ ボタンを使用します。

00:12:32.005 --> 00:12:35.265
私たちは識別しようとしています
R オブジェクトのみ、

00:12:35.265 --> 00:12:38.110
そして、私はまた、上で見たい
ここでライブオブジェクト。

00:12:38.110 --> 00:12:40.980
だから私はこの「適用」をヒット
ボタン、およびボイラ、

00:12:40.980 --> 00:12:43.575
2 つの詳細コントローラが表示されます
メモリにぶら下がっている,

00:12:43.575 --> 00:12:47.160
私はしないのに
所定の場所に詳細を持っています。

00:12:47.160 --> 00:12:48.570
>>スーパーサンプル、あなたが言ったので、

00:12:48.570 --> 00:12:50.289
私の名前スペースですべてを見つけて、

00:12:50.289 --> 00:12:51.610
その上でフィルターダウンします。

00:12:51.610 --> 00:12:54.820
文字通り、私たちがここで見るもの
は詳細ビュー コントローラ 2 です。

00:12:54.820 --> 00:12:55.225
>> はい。

00:12:55.225 --> 00:12:56.650
>> しかし、それはなくなっているはずです。

00:12:56.650 --> 00:13:00.015
>> 私は最大から始めます
これらのページにあるオブジェクト。

00:13:00.015 --> 00:13:00.280
>> はい。

00:13:00.280 --> 00:13:02.865
>>アンドロイドにも当てはまります。

00:13:02.865 --> 00:13:04.030
アクティビティを検索するだけです。

00:13:04.030 --> 00:13:05.395
ビュー モデル、または何でも、

00:13:05.395 --> 00:13:07.875
一度ビューを持っているからです
そこにぶら下がっているモデル、

00:13:07.875 --> 00:13:11.320
それはすべてをリンクし始める
他のオブジェクト。

00:13:11.320 --> 00:13:13.380
すべてのサービス、すべてのバインディング、

00:13:13.380 --> 00:13:16.605
すべてのAPI、そしてあなたは
たくさんのメモリを得る。

00:13:16.605 --> 00:13:17.500
>> わかった。

00:13:17.500 --> 00:13:19.465
>> それが真実であることを示しましょう。

00:13:19.465 --> 00:13:23.260
もう一つ開けます
時間は、「スナップショット」をヒット。

00:13:23.260 --> 00:13:25.455
ここには 3 つのインスタンスが表示されます。

00:13:25.455 --> 00:13:28.569
私は戻って、「スナップショット」を打つ、

00:13:28.569 --> 00:13:30.030
そして、それはメモリに残ります。

00:13:30.030 --> 00:13:30.660
>> あなたを得た。

00:13:30.660 --> 00:13:32.500
>> それでは、このメモリの問題を修正してみましょう。

00:13:32.500 --> 00:13:33.700
>> 準備はできています。

00:13:33.700 --> 00:13:36.470
>> どうやって直すの?

00:13:41.220 --> 00:13:43.525
これは詳細ページです。

00:13:43.525 --> 00:13:45.460
だから、私たちは購読を取り消す必要があります
何らかのイベントで。

00:13:45.460 --> 00:13:49.325
>> あなたを得た。だから、ここでの本当の問題
はイベントを購読しています。

00:13:49.325 --> 00:13:49.970
>> はい。

00:13:49.970 --> 00:13:52.135
>> その後、購読を取り消す必要がありますよね?

00:13:52.135 --> 00:13:54.550
>> そのは正しい。これ
良い習慣です。

00:13:54.550 --> 00:13:56.370
このプラスが等しいと思うたびに、

00:13:56.370 --> 00:13:59.490
あなたは単に次の場合に検索します
マイナス等があり、

00:13:59.490 --> 00:14:01.980
そうでない場合は、あなた
それを導入する必要があります。

00:14:01.980 --> 00:14:02.595
>> わかった。

00:14:02.595 --> 00:14:05.020
>> これは最初の表示です
メモリ リークが発生していることを示します。

00:14:05.020 --> 00:14:05.340
>> わかった。

00:14:05.340 --> 00:14:10.460
>> 唯一の例外は、
メイン ページで購読する場合は、

00:14:10.460 --> 00:14:12.285
ここのメインページのように、

00:14:12.285 --> 00:14:14.725
そして、あなたはこのページを確信しています

00:14:14.725 --> 00:14:18.010
行けないだろう
いつでもすぐに離れて。

00:14:18.010 --> 00:14:20.115
>> たぶん、あなたはそれを持っている
アプリの委任レベル。

00:14:20.115 --> 00:14:21.530
君は、実は僕みたいな
これを望む

00:14:21.530 --> 00:14:23.290
常にグローバルイベント。

00:14:23.290 --> 00:14:25.845
しかし、多分あなたのアプリの場合
バックグラウンドに入り、

00:14:25.845 --> 00:14:27.295
また、購読を取り消す必要があります。

00:14:27.295 --> 00:14:28.345
>> それは本当です。

00:14:28.345 --> 00:14:28.675
>> はい。

00:14:28.675 --> 00:14:29.700
>> 実行しません。

00:14:29.700 --> 00:14:31.750
>> だから今、あなたは言っている
表示されたら、

00:14:31.750 --> 00:14:33.855
それは購読し、消え、

00:14:33.855 --> 00:14:35.935
購読を取り消し、次にあなた
上に1つを削除します。

00:14:35.935 --> 00:14:37.990
>> はい、クラウドから削除しました。

00:14:37.990 --> 00:14:39.710
私たちがしたいので
私たちが毎回それを実行します

00:14:39.710 --> 00:14:42.040
が現れ、私たちが消えるたびに。

00:14:42.040 --> 00:14:43.850
購読に等しいプラス、

00:14:43.850 --> 00:14:45.640
購読取り消しに等しい値を引いた値。

00:14:45.640 --> 00:14:48.735
複雑なものは何もなく、ただしたいだけ

00:14:48.735 --> 00:14:52.045
必要とされていないことを確認する
一度それを通過する楽器。

00:14:52.045 --> 00:14:52.720
>> クール。

00:14:52.720 --> 00:14:55.110
>> だから私は同じことをしている、

00:14:55.110 --> 00:14:59.490
詳細に行く,
それが真実であることを示している。

00:14:59.490 --> 00:15:02.980
スナップショットの作成,
私のイベントにフィルターを入ります。

00:15:02.980 --> 00:15:05.300
すみません。クリックしただけです。

00:15:08.700 --> 00:15:12.170
ライブオブジェクトを見てみましょう。

00:15:12.420 --> 00:15:15.345
詳細が表示されます。
私たちは現在オンになっているので

00:15:15.345 --> 00:15:17.475
詳細ページを参照してください。戻る

00:15:17.475 --> 00:15:18.990
私たちは「スナップショット」をヒット

00:15:18.990 --> 00:15:20.880
そして、私たちはここで何を期待していますか?

00:15:20.880 --> 00:15:23.715
まず、ガベージ コレクションは実際に

00:15:23.715 --> 00:15:26.065
これらのオブジェクトをに入れる
ファイナライズ キュー,

00:15:26.065 --> 00:15:27.625
しかし、第二は1をキューする必要があります,

00:15:27.625 --> 00:15:30.340
またはおそらくまだ同じものです。

00:15:30.340 --> 00:15:31.570
>> 今、それは行ってしまいました。

00:15:31.570 --> 00:15:33.910
>> はい。それでは、私について話をさせてください

00:15:33.910 --> 00:15:36.940
でのファイナライズ キュー
第二に、しかし、今のところ、

00:15:36.940 --> 00:15:40.395
アイデアは、私たちが持っているということです
私たちの詳細ビューを失った、

00:15:40.395 --> 00:15:43.135
そして、私たちのメモリ使用量が減少しています。

00:15:43.135 --> 00:15:43.770
>> 美しい。

00:15:43.770 --> 00:15:46.150
>> そうやってメモリリークを修正します。

00:15:46.150 --> 00:15:49.420
>> はい。をサブスクライブしました
イベント。イベントの購読を取り消します。

00:15:49.420 --> 00:15:51.630
>> 基本的な経験則。

00:15:51.630 --> 00:15:54.915
>> それはあまりにも本当に面白いです
1 つであるため、2 つの問題が発生します。

00:15:54.915 --> 00:15:56.800
私たちは、あなたがそれを生き続けているのを見た

00:15:56.800 --> 00:15:58.750
なぜなら、これらの出来事は続くからです。

00:15:58.750 --> 00:16:00.715
だから今、あなたは発砲している
それらを複数回、

00:16:00.715 --> 00:16:04.290
しかし、そのページ上の何でも
はメモリに残ります。

00:16:04.290 --> 00:16:06.685
>> そうですね。そういうわけで
私たちは重いイメージを追加しました,

00:16:06.685 --> 00:16:08.205
そして、それはまだメモリ内にあります。

00:16:08.205 --> 00:16:08.830
>> わかった。

00:16:08.830 --> 00:16:10.570
>> 楽器を見せてあげよう。

00:16:10.570 --> 00:16:13.390
だから私は紹介するつもりです
メモリリークをバックアップします。

00:16:13.390 --> 00:16:13.800
>> 確かに。

00:16:13.800 --> 00:16:15.985
>> 購読されていないイベントを削除するだけです。

00:16:15.985 --> 00:16:18.435
シミュレータに展開するつもりです。

00:16:18.435 --> 00:16:21.330
そして器械はかなり容易に働く。

00:16:21.330 --> 00:16:23.355
ターゲットを選択するだけです。

00:16:23.355 --> 00:16:25.930
シミュレータと
アプリ、それはそれです。

00:16:25.930 --> 00:16:28.435
あなたが始める必要があるのはそれだけです
インスツルメンツプロファイラー。

00:16:28.435 --> 00:16:30.175
それはXamarinアプリですが、

00:16:30.175 --> 00:16:32.150
あなたはそれを正しく開始することができます
楽器から、

00:16:32.150 --> 00:16:33.615
ザマリンについて何も知らない

00:16:33.615 --> 00:16:35.310
>> インストゥルメントはどこから来るの?

00:16:35.310 --> 00:16:38.709
>> アップル。それはアップルです
ツールは、Xcodeが付属しています,

00:16:38.709 --> 00:16:41.950
そして、それは多くを持っています
その中に工具。

00:16:41.950 --> 00:16:43.450
>> だから、それはちょうど組み込まれている
あなたが既に持っているので

00:16:43.450 --> 00:16:45.415
Xcode がインストールされていますか?だから
誰もがこれを持っていますか?

00:16:45.415 --> 00:16:46.015
>> 無料です。

00:16:46.015 --> 00:16:48.925
>> 無料です。クール。だから誰でも
今すぐ使えますか。

00:16:48.925 --> 00:16:53.880
>> はい。実際には
これらの活動を参照してください。

00:16:53.880 --> 00:16:57.920
マネージによって作成されたものであっても
詳細な活動のような世界、

00:16:57.920 --> 00:17:00.525
それはまだ表されています
ネイティブ オブジェクトによって使用できます。

00:17:00.525 --> 00:17:00.930
>> わかった。

00:17:00.930 --> 00:17:02.855
>> それでは、そのオブジェクトを探してみましょう。

00:17:02.855 --> 00:17:07.240
私たちはそれを詳細ビューコントローラと呼びます。

00:17:07.240 --> 00:17:09.595
そのうちのいくつかを作成しましょう。

00:17:09.595 --> 00:17:11.030
>> これは実際に
本当にクールなので

00:17:11.030 --> 00:17:12.240
私は楽器を使ったことがない

00:17:12.240 --> 00:17:15.295
何年も誰にも言わないで

00:17:15.295 --> 00:17:18.440
私は誰もが与えているとは思わない
私に詳細を教えてください。だから、それは存在するのですか?

00:17:18.440 --> 00:17:20.070
>> はい、存在します。

00:17:20.070 --> 00:17:22.335
>> それは理にかなっている
Xamarin はネイティブであるため、

00:17:22.335 --> 00:17:23.770
そのため、ネイティブ オブジェクトが作成されます。

00:17:23.770 --> 00:17:26.380
>> はい。あなたはする必要はありません

00:17:26.380 --> 00:17:27.885
ここでのメモリスナップショット

00:17:27.885 --> 00:17:29.975
私たちが持っていないので
ここでガベージ コレクションを実行します。

00:17:29.975 --> 00:17:33.780
IOS は階層を使用します。
自動参照カウンタ。

00:17:33.780 --> 00:17:35.605
基本的には、常に
オブジェクトを作成する

00:17:35.605 --> 00:17:37.065
カウンタをインクリメントします。

00:17:37.065 --> 00:17:39.550
あなたが使用しない場合、またはそれを使用しないとき

00:17:39.550 --> 00:17:42.505
の範囲から離れる
使用法は、カウンターをデクリメントします。

00:17:42.505 --> 00:17:43.845
カウンタがゼロになると、

00:17:43.845 --> 00:17:46.495
オブジェクトはガベージであり、
収集できます。

00:17:46.495 --> 00:17:48.075
だから始めはかなり簡単です

00:17:48.075 --> 00:17:51.735
アプリを持つ楽器
このボタンをクリックするだけで。

00:17:51.735 --> 00:17:53.505
アプリを起動し、

00:17:53.505 --> 00:17:55.860
ここにメモリ使用量が表示されます。

00:17:55.860 --> 00:17:57.690
[詳細] ページを開きましょう。

00:17:57.690 --> 00:18:00.425
>> あなたを得た。楽器
アップルから来ていますか?

00:18:00.425 --> 00:18:02.040
>>楽器はアップルから来ています。

00:18:02.040 --> 00:18:03.350
それはアップルからの無料のツールです。

00:18:03.350 --> 00:18:04.490
今すぐご利用ください。

00:18:04.490 --> 00:18:05.390
>> クール。

00:18:05.390 --> 00:18:06.970
>> 私たちも持っているのを見る

00:18:06.970 --> 00:18:10.140
このメモリフットプリント右
ここでは、詳細ページを開きます。

00:18:10.140 --> 00:18:12.120
もう一度開きましょう。

00:18:12.120 --> 00:18:15.140
>> だから、これは非常に似ています
ザマリンプロファイラーに、

00:18:15.140 --> 00:18:16.870
しかし、これは私たちを示すつもりです

00:18:16.870 --> 00:18:19.240
すべてのネイティブ スタック
意図と目的。

00:18:19.240 --> 00:18:21.500
>> そうですね。残念ながら、

00:18:21.500 --> 00:18:24.090
何も知らない
シャマリンとマネージドワールド、

00:18:24.090 --> 00:18:27.025
あなたが見ることができないので
作成した管理オブジェクト。

00:18:27.025 --> 00:18:28.990
スパイクが見えるわけで、

00:18:28.990 --> 00:18:30.850
そして、あなたはそれを消えないことがわかります。

00:18:30.850 --> 00:18:33.350
だから3回目にやらせてください。

00:18:33.350 --> 00:18:35.145
オブジェクトを表示するだけです。

00:18:35.145 --> 00:18:38.455
それでは、見てみましょう。あるんだ
小さなフィルター ボタン。

00:18:38.455 --> 00:18:43.170
私たちはここですべての割り当てに行きます。

00:18:43.170 --> 00:18:45.165
「詳細」を押します。

00:18:45.165 --> 00:18:45.820
>> わかった。

00:18:45.820 --> 00:18:47.555
>> ここは3ページです。

00:18:47.555 --> 00:18:48.660
彼らは皆記憶に入っている

00:18:48.660 --> 00:18:50.650
メモリに割り当てます。

00:18:50.650 --> 00:18:54.070
割り当て解除の仕方は見せない
それは同じ修正なので、

00:18:54.070 --> 00:18:57.020
購読を取り消すだけです。
マネージワールドの購読取り消し

00:18:57.020 --> 00:19:00.120
をオブジェクトから取得します。オブジェクト
ゴミとみなされます。

00:19:00.120 --> 00:19:04.660
その後、私たちのガベージコレクター
その情報を収集し、

00:19:04.660 --> 00:19:06.460
その後、ネイティブは収集することができます
何もないので

00:19:06.460 --> 00:19:08.490
世界を管理することから
すでにそれを保持しています。

00:19:08.490 --> 00:19:10.780
>> 理にかなっている。とても
ほとんど同じ修正,

00:19:10.780 --> 00:19:12.255
しかし、それを検出する別の方法。

00:19:12.255 --> 00:19:15.045
>> そうですね。ですからこれは

00:19:15.045 --> 00:19:19.345
間の相違点について
マネージとネイティブの世界。

00:19:19.345 --> 00:19:22.120
私の次の例は、
主に管理について

00:19:22.120 --> 00:19:25.320
あなたができるから世界
任意の問題を導入し、

00:19:25.320 --> 00:19:26.905
そして、それはシャマリンとは関係ありません。

00:19:26.905 --> 00:19:29.570
あなたが言ったように、それは
静的イベントのサブスクライブ,

00:19:29.570 --> 00:19:32.745
それは導入する可能性があります
どこでも問題。

00:19:32.745 --> 00:19:35.410
だから、次のものは

00:19:35.410 --> 00:19:38.210
サブスクリプションについて、
サブスクリプションなし。

00:19:38.210 --> 00:19:39.315
しかし、この場合、

00:19:39.315 --> 00:19:42.820
私たちは実際に
暗黙的にサブスクライブする、

00:19:42.820 --> 00:19:44.480
プラス等号は使いません。

00:19:44.480 --> 00:19:46.015
だから、見つけるのは難しいです。

00:19:46.015 --> 00:19:48.710
この場合、これを実行します。
通知センターが試行しています

00:19:48.710 --> 00:19:51.795
アプリがローテーションされるたびに識別します。

00:19:51.795 --> 00:19:53.695
私たちは、このオブザーバーを追加します。

00:19:53.695 --> 00:19:57.525
これはシングルトンのデフォルトセンターです。

00:19:57.525 --> 00:19:59.700
私たちはそれを言っている、私は得たい

00:19:59.700 --> 00:20:02.595
いつでもあらゆる情報
向きが変更されましたが、

00:20:02.595 --> 00:20:04.140
そして、ここに私のハンドラーがあります。

00:20:04.140 --> 00:20:04.650
>> わかった。

00:20:04.650 --> 00:20:06.690
>> ハンドラ自体、
それはかなり簡単です。

00:20:06.690 --> 00:20:08.125
私たちはそこで何もしません

00:20:08.125 --> 00:20:11.665
デバッグするために印刷するだけです。

00:20:11.665 --> 00:20:12.465
>> わかった。

00:20:12.465 --> 00:20:15.525
>> 私は私を削除してみましょう
接続性の問題

00:20:15.525 --> 00:20:18.630
私たちは、異なる導入したい
メモリの問題の種類。

00:20:18.630 --> 00:20:21.525
私はまた、私たちのコメントアウト
私たちは必要ないので、画像

00:20:21.525 --> 00:20:24.430
メモリを表示するには
フットプリント、それはそこにあります。

00:20:24.430 --> 00:20:28.390
私たちはちょうどで実験します
UI ビュー のコントローラーとビュー。

00:20:28.390 --> 00:20:30.650
>>非常にクール。だからその
非常に似ていますが、

00:20:30.650 --> 00:20:32.870
しかし、このパターンは、あなた
購読している可能性があります。

00:20:32.870 --> 00:20:34.605
たぶん、アクションを渡すことさえできます。

00:20:34.605 --> 00:20:38.340
または、この場合、それは何をするのか
ここにあなたのコールバックが書いてある。

00:20:38.340 --> 00:20:40.010
デリゲートは非常によく似ています。

00:20:40.010 --> 00:20:41.115
私はこのパターンに思います。

00:20:41.115 --> 00:20:42.480
だから、それはただの何かです
私も慣しています。

00:20:42.480 --> 00:20:45.590
>> そうですね。あれは

00:20:45.590 --> 00:20:47.864
彼らの主なアイデアは、
あなたが購読しているとき、

00:20:47.864 --> 00:20:51.405
参照を渡している
UI ビュー コントローラーも同様です。

00:20:51.405 --> 00:20:53.425
これは単に違う
参照を渡す方法。

00:20:53.425 --> 00:20:55.260
それは時々明白ではありません。

00:20:55.260 --> 00:20:57.955
だから、私たちはサブスクリプションを持っている、
それはここで実行されています。

00:20:57.955 --> 00:20:59.305
一度だけ走ってる

00:20:59.305 --> 00:21:01.780
閉じてもう一度開きましょう。

00:21:01.780 --> 00:21:03.525
今、私たちはダブルクリックを持っています。

00:21:03.525 --> 00:21:05.230
これを見せてあげましょう。

00:21:05.230 --> 00:21:07.240
一度回転し、2つを得て、

00:21:07.240 --> 00:21:11.655
これは、いくつかのUIビューを持っていることを意味します
メモリにぶら下がっているコントローラ、

00:21:11.655 --> 00:21:13.535
最初の処理中。

00:21:13.535 --> 00:21:13.980
>> わかった。

00:21:13.980 --> 00:21:15.430
>> あなたが持っている場合は、問題になる可能性があります

00:21:15.430 --> 00:21:19.660
いくつかのデータベース更新ロジック
または HTTP 要求超過を要求します。

00:21:19.660 --> 00:21:21.340
使用日のように、

00:21:21.340 --> 00:21:24.810
あなたのアプリは殺されていない、あなた
非アクティブ化、再アクティブ化します。

00:21:24.810 --> 00:21:26.740
これはすべて持つでしょう
メモリ内にまだ表示し、

00:21:26.740 --> 00:21:28.265
そして1週間で、それはクラッシュする可能性があります。

00:21:28.265 --> 00:21:28.785
>> はい。

00:21:28.785 --> 00:21:30.105
>> どうやって修正するの?

00:21:30.105 --> 00:21:31.550
それは非常に簡単です。

00:21:31.550 --> 00:21:34.145
>> 私はあなたが購読を取り消したと仮定しますか?

00:21:34.145 --> 00:21:35.835
>> そうですね。それは難しいです

00:21:35.835 --> 00:21:38.685
購読を取り消す
プラス等を持っていません。

00:21:38.685 --> 00:21:42.010
あなたにも見せてあげよう
実際にここに送ってください。

00:21:42.010 --> 00:21:43.365
あなたが購読するとき、

00:21:43.365 --> 00:21:46.395
メソッド名を渡しています。

00:21:46.395 --> 00:21:48.215
実際にアクションを渡している

00:21:48.215 --> 00:21:51.745
コンパイラが
それを隠す素晴らしい仕事、

00:21:51.745 --> 00:21:54.150
そして私たちの生活を楽にします。

00:21:54.150 --> 00:21:55.945
>>コンパイラは非常に素晴らしいです。

00:21:55.945 --> 00:21:57.255
>>私たちに非常に素晴らしいです。

00:21:57.255 --> 00:22:00.415
そのため、私たちは開発者になりたいのです。

00:22:00.415 --> 00:22:04.360
だから、それは実際に求める
NSNotification を使用してアクションを実行します。

00:22:04.360 --> 00:22:07.840
だから私はここでNS通知に署名しています

00:22:07.840 --> 00:22:13.365
そして、この表記を使用して、
このオブジェクトを貼り付けます。

00:22:13.365 --> 00:22:16.560
したがって、メソッド名の代わりに、

00:22:16.560 --> 00:22:19.225
私たちは実際に合格しています
アクションとオブジェクト、

00:22:19.225 --> 00:22:20.960
への参照を保持する

00:22:20.960 --> 00:22:23.610
方法に関するこれらのメタデータ
をクリックしてメソッドを呼び出します。

00:22:23.610 --> 00:22:26.555
だから、私たちはメソッドを渡さない
これは単なる参照です。

00:22:26.555 --> 00:22:30.060
私たちの場合、最も重要なのは
この参照を渡すときの部分、

00:22:30.060 --> 00:22:32.155
これはUIVコントローラであり、

00:22:32.155 --> 00:22:34.170
だから記憶にとらわれているのです。

00:22:34.170 --> 00:22:35.260
>> わかった。

00:22:35.260 --> 00:22:35.865
>> わかった。

00:22:35.865 --> 00:22:36.670
>> 理にかなっている。はい。

00:22:36.670 --> 00:22:38.595
>> 詳細を表示しない

00:22:38.595 --> 00:22:40.390
メモリ
リークはまだそこにあります

00:22:40.390 --> 00:22:43.975
私たちはこれらを見たので
時間を節約するために何か。

00:22:43.975 --> 00:22:45.500
私は焦点を当てたい

00:22:45.500 --> 00:22:48.830
最悪のシナリオ
あなたは注意する必要があります。

00:22:48.830 --> 00:22:54.250
ネイティブの世界が置かれないとき
うまく管理された世界と。

00:22:54.250 --> 00:22:56.280
>> あなたを得た。の場合
二つの世界が衝突する。

00:22:56.280 --> 00:23:00.265
>> それは常に正しいので、
管理オブジェクトが作成されました。

00:23:00.265 --> 00:23:02.155
ネイティブ オブジェクトが作成され、

00:23:02.155 --> 00:23:05.690
そして、彼/彼女はしようとしています
ネイティブ オブジェクトの割り当て解除、

00:23:05.690 --> 00:23:07.495
私たちの管理された世界は考え、

00:23:07.495 --> 00:23:09.330
私はまだこのオブジェクトで終わっていません。

00:23:09.330 --> 00:23:11.270
しっかりつかまって下さい

00:23:11.270 --> 00:23:13.765
オブジェクトを収集する理由
私はまだそれで働いています。

00:23:13.765 --> 00:23:14.525
>> あなたを得た。

00:23:14.525 --> 00:23:15.805
>> それは反対かもしれない、

00:23:15.805 --> 00:23:19.130
ネイティブの世界のとき
オブジェクトを作成できます。

00:23:19.130 --> 00:23:20.265
そして今、管理された世界は考える

00:23:20.265 --> 00:23:22.450
それはまだ行っていません
そこで、待ちましょう。

00:23:22.450 --> 00:23:25.015
たとえあなたが他にいなくても
このオブジェクトへの参照、

00:23:25.015 --> 00:23:29.015
それはそれを保持することができ、それは
ゴミとしてではなく保管してください。

00:23:29.015 --> 00:23:29.820
>> あなたを得た。

00:23:29.820 --> 00:23:31.460
>> 私はそれを説明することができました

00:23:31.460 --> 00:23:34.640
これらの小さな小さな画像
不滅の物体の。

00:23:34.640 --> 00:23:37.230
だから、不滅を作るな
オブジェクト。それらは悪いです。

00:23:37.230 --> 00:23:38.435
>> かっこいいですね。

00:23:38.435 --> 00:23:39.963
>> はい。

00:23:39.963 --> 00:23:43.355
それはあなたが起こる
この二つの世界を持っている。

00:23:43.355 --> 00:23:46.925
ネイティブ、あなたは右側に見える
ネイティブ ビュー コントローラーとビュー,

00:23:46.925 --> 00:23:49.640
そして左から

00:23:49.640 --> 00:23:52.580
マネージワールドCシャープは、
コントローラとビューを表示します。

00:23:52.580 --> 00:23:55.640
何が何なのか分からない時はいつでも
ネイティブの世界で起こっている、

00:23:55.640 --> 00:23:58.070
収集することはできません
この世界から

00:23:58.070 --> 00:24:00.905
一つの例を見せてあげよう
どのようにそれを行うことができます。

00:24:00.905 --> 00:24:03.275
だから私の例では、

00:24:03.275 --> 00:24:07.235
私はここに小さく追加したい
小さなボタン「保存」、

00:24:07.235 --> 00:24:11.375
そして、単に閉じたい
ユーザーがヒットしたら表示します。

00:24:11.375 --> 00:24:13.925
と仮定して、
「保存」ボタンも行います

00:24:13.925 --> 00:24:17.330
いくつかの保存ロジックデータベース
または HTTP は何でも呼び出し、

00:24:17.330 --> 00:24:19.055
ただ戻らないだけ

00:24:19.055 --> 00:24:22.145
そして、それは実際に実行されます
いくつかの追加のアクション。

00:24:22.145 --> 00:24:22.775
>> わかった。

00:24:22.775 --> 00:24:24.980
>> これらのボタンの詳細として、

00:24:24.980 --> 00:24:26.300
ハンドラで送信します。

00:24:26.300 --> 00:24:31.205
このハンドラは次のことを言っています。
これらのコントローラを閉じてください。

00:24:31.205 --> 00:24:33.395
>>私には完全に正当に見えます。

00:24:33.395 --> 00:24:35.255
>> はい。ご紹介します
メモリ リーク。

00:24:35.255 --> 00:24:36.230
>> わかった。

00:24:36.230 --> 00:24:42.515
>> お前は悪い残念ながら
そして、それは一般的なパターンです。

00:24:42.515 --> 00:24:45.005
私たちは何も持っていません
このような静的イベント。

00:24:45.005 --> 00:24:47.195
私たちは何も持っていません
このようなシングルトーン。

00:24:47.195 --> 00:24:49.025
このボタンをここに置いておくだけだ

00:24:49.025 --> 00:24:51.650
これは単なるローカル項目です。

00:24:51.650 --> 00:24:54.260
オーケー・ジェームズ、今、私たちは
ボタンを作成し、

00:24:54.260 --> 00:24:56.735
私たちはそれを追加したい
ナビゲーション ビュー。

00:24:56.735 --> 00:25:00.440
だから、私たちはそれを通して言った
ナビゲーション項目も使用しない

00:25:00.440 --> 00:25:05.225
任意の静的参照は何もありません
それが好きで、それだけ。

00:25:05.225 --> 00:25:08.015
これでサブボタンが表示されます。
プロファイラーを起動してみましょう。

00:25:08.015 --> 00:25:09.890
>> はい、何度も、
超似たようなパターン。

00:25:09.890 --> 00:25:11.285
私はボタンを作成し、

00:25:11.285 --> 00:25:15.800
ボタンを追加し、私はポップ
ビューコントローラは正常に見えます。

00:25:15.800 --> 00:25:18.185
>> 使用しない代理人を持っている

00:25:18.185 --> 00:25:20.540
外部参照または静的参照

00:25:20.540 --> 00:25:23.225
参照を渡さない
私たちのコントローラから。

00:25:23.225 --> 00:25:23.750
>> あなたを得た。

00:25:23.750 --> 00:25:27.090
>> 正常に動作する必要があります。
そうです。えっと。

00:25:27.280 --> 00:25:32.780
したがって、プロファイラーはオブジェクトを表示します。

00:25:32.780 --> 00:25:34.760
非常に最初に作成され、私は

00:25:34.760 --> 00:25:37.790
追跡を開始する
彼らは最初に。

00:25:37.790 --> 00:25:39.530
だから私は右のスナップショットを隠しました

00:25:39.530 --> 00:25:42.455
今、私のオブジェクトのみにフィルタリング。

00:25:42.455 --> 00:25:45.380
再び非常に一般的です
トラブルシューティングするパターン

00:25:45.380 --> 00:25:48.800
メモリの問題だけに
私のオブジェクトのみを参照してください。

00:25:48.800 --> 00:25:52.235
それから私は一度そこに行ってしまった。
これは私のボタンです。

00:25:52.235 --> 00:25:55.565
ご覧のとおり、これは新しいコントロールです。
うまく私たちのアプリケーション。

00:25:55.565 --> 00:25:56.870
私たちはこれを記憶に持っています。

00:25:56.870 --> 00:25:58.745
本当ですが、私たちはそれを期待しています。

00:25:58.745 --> 00:26:03.410
戻って、1つを打ちましょう
より多くの時間ともう一度。

00:26:03.410 --> 00:26:04.430
>> 私が知っているので、もう一度。

00:26:04.430 --> 00:26:05.195
>> もう一度。

00:26:05.195 --> 00:26:06.380
>> さて、まだそこにあります。

00:26:06.380 --> 00:26:08.270
>> もう一度、それはまだそこにあります。

00:26:08.270 --> 00:26:11.030
だから、それを開いて、より多くの時間をしましょう。

00:26:11.030 --> 00:26:14.090
また閉めよう
戻る別の方法,

00:26:14.090 --> 00:26:17.390
保存するつもりです、それは実際に
基本的に同じことをしています。

00:26:17.390 --> 00:26:20.090
「メモリ」をヒットしてみましょう
スナップショット"もう一つ

00:26:20.090 --> 00:26:22.610
時間とああうわー私たち
のインスタンスが 5 つある

00:26:22.610 --> 00:26:24.920
そこにぶら下がっているページ
メモリとあなたが持っている場合

00:26:24.920 --> 00:26:28.130
そこに巨大なイメージがある
たくさんの記憶があるだろう

00:26:28.130 --> 00:26:28.550
>> わかった。

00:26:28.550 --> 00:26:32.615
>> それは非常に一般的なパターンです

00:26:32.615 --> 00:26:36.800
それは明らかではないので
ここにメモリ リークがあります。

00:26:36.800 --> 00:26:39.830
ここでの問題は
その UIBar ボタン項目

00:26:39.830 --> 00:26:43.910
実際に保持する
いくつかのネイティブリソース、

00:26:43.910 --> 00:26:45.485
ネイティブ リソースにバインドされます。

00:26:45.485 --> 00:26:49.100
はっきり言わなければ
私はもはやこのボタンを必要としません

00:26:49.100 --> 00:26:51.020
あなたは導入します
この不滅の物体。

00:26:51.020 --> 00:26:53.135
>> あなたを得た。では、どのように行う
私はこの事を解決する?

00:26:53.135 --> 00:26:56.240
>> それを解決するために、使用してみましょう

00:26:56.240 --> 00:26:59.900
私たちのビュー消しイベントと
私たちのボタンで何かをする。

00:26:59.900 --> 00:27:00.150
>> わかった。

00:27:00.150 --> 00:27:01.220
>> 2つの選択肢があるので、

00:27:01.220 --> 00:27:02.735
私たちは、どちらかを使用することができます

00:27:02.735 --> 00:27:05.299
クリックされたイベントと
購読と購読取り消し,

00:27:05.299 --> 00:27:07.160
しかし、私たちはに戻ります

00:27:07.160 --> 00:27:10.400
購読時の最初のアイテム
購読を取り消すことなく。

00:27:10.400 --> 00:27:12.560
もっと面白いことをしよう。

00:27:12.560 --> 00:27:14.030
ボタンを処分します。

00:27:14.030 --> 00:27:15.680
>>私はそれが好きです。私は
それで終わったでしょ?

00:27:15.680 --> 00:27:18.320
>> はい、私たちは何となく言っています
マネージワールド、

00:27:18.320 --> 00:27:20.495
「ボタンはもう終わりだ。
処分してください。

00:27:20.495 --> 00:27:24.365
それは明らかではないので、
ビューとラッパーの多く

00:27:24.365 --> 00:27:26.540
Xamarin iOSでは、
この破棄メソッドと

00:27:26.540 --> 00:27:29.015
あなたは本当にいつでも知らない
あなたはそれを呼び出す必要があります。

00:27:29.015 --> 00:27:30.815
だから、それは興味深いケースです。

00:27:30.815 --> 00:27:32.975
しかし、そうやって走りましょう。

00:27:32.975 --> 00:27:34.700
それは私が追加した唯一のアクションです

00:27:34.700 --> 00:27:37.500
前のアプリケーションが実行されてから。

00:27:38.290 --> 00:27:42.530
プロファイラーを起動しています
と同じユースケースを行います。

00:27:42.530 --> 00:27:44.000
オブジェクトを追跡します。

00:27:44.000 --> 00:27:46.310
非常に始まりと作る
それらが破棄されていることを確認します。

00:27:46.310 --> 00:27:48.050
>>非常にクール。これはいいですね。

00:27:48.050 --> 00:27:49.670
だから、あなたが言ったように、

00:27:49.670 --> 00:27:53.270
渡す代わりに
での全体のアクション、

00:27:53.270 --> 00:27:55.130
あなたは私たち方と同じようにすることができます

00:27:55.130 --> 00:27:57.605
接続を行い、
購読, 購読取り消し,

00:27:57.605 --> 00:28:00.590
私はそれを考えただろう
アウト、しかし、この場合、

00:28:00.590 --> 00:28:03.125
あなたはすでにそうしました
あなたはそれを処分するだけです。

00:28:03.125 --> 00:28:04.010
>> そうですね。

00:28:04.010 --> 00:28:04.875
>> クール。

00:28:04.875 --> 00:28:08.455
>> はい、私たちはしないので
購読解除されることを期待します。

00:28:08.455 --> 00:28:10.840
サブスクリプションのようなものではありません。

00:28:10.840 --> 00:28:14.230
私たちはただ合格し、委任するだけ
ローカル オブジェクトの内部。

00:28:14.230 --> 00:28:16.045
通知センターの場合、

00:28:16.045 --> 00:28:18.790
それはサブスクリプションの一種です。
私たちはローカルオブジェクトを渡します

00:28:18.790 --> 00:28:21.760
いくつかの静的な
インスタンスまたはシングルトン。

00:28:21.760 --> 00:28:24.760
この場合、私たちはちょうど使用しました
私たちの地元のリソースで、

00:28:24.760 --> 00:28:26.395
メモリ リークは発生しません。

00:28:26.395 --> 00:28:26.680
>> あなたを得た。

00:28:26.680 --> 00:28:28.630
>> しかし、残念ながら私は見ることができます

00:28:28.630 --> 00:28:32.660
この障壁はたくさん、人々
これらの状況に入る。

00:28:32.680 --> 00:28:37.530
だから、同じトリックを行いましょう。

00:28:37.750 --> 00:28:41.760
私はそれがこのデータを保存したいと思います。

00:28:41.950 --> 00:28:46.310
だから、私たちはただ1つのビューを持っています
コントローラーとデリゲート。

00:28:46.310 --> 00:28:48.290
「保存」をヒットしてみましょう。

00:28:48.290 --> 00:28:51.215
戻りましょう。

00:28:51.215 --> 00:28:54.005
実際に詳細ページに滞在しましょう。

00:28:54.005 --> 00:28:56.975
「メモリスナップショット」を押して、私たちは1つを見る。

00:28:56.975 --> 00:28:59.315
もう数回クリックさせてください。

00:28:59.315 --> 00:29:02.735
そのことについて話し合おうだから私たちは
ここにはインスタンスが 1 つだけある。

00:29:02.735 --> 00:29:10.805
「保存」をクリックし、「スナップショット」をクリックします。
そして、それはスキャンを消します。

00:29:10.805 --> 00:29:12.380
大丈夫です。メモリ リークを修正しました。

00:29:12.380 --> 00:29:13.250
>>非常にクール。素晴らしい。

00:29:13.250 --> 00:29:14.900
>> 不滅の物体が殺された。

00:29:14.900 --> 00:29:16.445
>> 殺された。非常にクール。

00:29:16.445 --> 00:29:17.810
それ以外の場合、これは素晴らしいです。

00:29:17.810 --> 00:29:20.600
だから非常に簡単な、あなたのイベントを見て、

00:29:20.600 --> 00:29:22.850
しかし、あなたがどのように渡しているかを見てください

00:29:22.850 --> 00:29:24.890
周り、さらには私の周りのこれらのアクション

00:29:24.890 --> 00:29:26.870
それについても考えないだろう
あなたに正直に言うボタン

00:29:26.870 --> 00:29:29.315
コンストラクタ
この事を渡しています。

00:29:29.315 --> 00:29:29.600
>> はい。

00:29:29.600 --> 00:29:30.725
>>とてもクールです。

00:29:30.725 --> 00:29:33.350
>> 私もお勧めします

00:29:33.350 --> 00:29:36.425
私たちの開発者は、より多くそれを使用する
多くの場合、週に一度好きに、

00:29:36.425 --> 00:29:39.545
すべてのスプリントと
メモリ使用量を参照してください。

00:29:39.545 --> 00:29:41.585
UI テストの実行として表示できます。

00:29:41.585 --> 00:29:45.590
それはこの小さなを示しています
メモリ ワーキング セット。

00:29:45.590 --> 00:29:48.050
だから、あなたはただ見渡す
それが成長している場合は数ヶ月または

00:29:48.050 --> 00:29:51.530
そうでないし、それがあなたを成長させれば
おそらくメモリ リークがあります。

00:29:51.530 --> 00:29:53.360
>> あなたはiOSを示しました。

00:29:53.360 --> 00:29:54.560
さて、アンドロイドはどうですか?

00:29:54.560 --> 00:29:57.500
その他の特定の方法はありますか
あなたが使用できるそこにツール?

00:29:57.500 --> 00:29:59.465
>> それは素晴らしい質問です
なぜなら、 アンドロイド,

00:29:59.465 --> 00:30:02.000
私たちが話したすべて
iOS は Android に適用されます。

00:30:02.000 --> 00:30:02.150
>> あなたを得た。

00:30:02.150 --> 00:30:03.440
>>ちょうどのために別のツールを持っている

00:30:03.440 --> 00:30:07.145
アンドロイドネイティブプロファイラー
アンドロイドプロファイラーと呼ばれます。

00:30:07.145 --> 00:30:08.390
それは本当にクールです。

00:30:08.390 --> 00:30:09.740
それはあなたに多くを示しています

00:30:09.740 --> 00:30:12.380
情報が、あなたはまだ持っている
誰が誰であるのにそれを使用する必要があります

00:30:12.380 --> 00:30:14.330
組み合わせてザカマリンプロファイラー

00:30:14.330 --> 00:30:16.790
管理のため
世界とネイティブの世界。

00:30:16.790 --> 00:30:17.930
>> あなたを得た。それは単にそれを

00:30:17.930 --> 00:30:19.340
それはクールだったように聞こえる
素晴らしいツールがあります

00:30:19.340 --> 00:30:22.400
どこにいても利用可能
あなたは、iOS、アンドロイドにいます。

00:30:22.400 --> 00:30:23.240
>> そのりです。

00:30:23.240 --> 00:30:24.005
>> 私は先に行くと、それを行うことができます。

00:30:24.005 --> 00:30:25.820
正直なところ、ただ見ているだけ
これらのいくつかで、

00:30:25.820 --> 00:30:28.160
私は私のコードをかなり確信しています
悪いものがたくさんあります。

00:30:28.160 --> 00:30:29.480
だから、次にストリーミングするとき

00:30:29.480 --> 00:30:31.790
それはすべてになるだろう
私のメモリリークを修正します。

00:30:31.790 --> 00:30:32.180
>> わかった。

00:30:32.180 --> 00:30:34.280
>>非常にクール。その他アレクシ
あなたが話したいですか?

00:30:34.280 --> 00:30:35.315
>> 今日はそれだけ。

00:30:35.315 --> 00:30:37.865
>> 素晴らしい。まあ、ありがとう
誰もがチューニングのために。

00:30:37.865 --> 00:30:40.010
アレクシ、どうもありがとうございました
このすべてのものを表示します。

00:30:40.010 --> 00:30:42.305
>> 皆さんありがとうございます。感謝
あなたは私を許してくれたジェームズです。

00:30:42.305 --> 00:30:43.970
>> 絶対に、そして確認してください

00:30:43.970 --> 00:30:45.920
あなたがすべてをチェックアウトすることを
以下のショーノート、

00:30:45.920 --> 00:30:47.420
すべてのソースを開く
コード, すべてのリンク

00:30:47.420 --> 00:30:48.980
そこにあるすべてのドキュメントのために。

00:30:48.980 --> 00:30:51.740
aka.ms/Xamarinに移動することもできます。

00:30:51.740 --> 00:30:54.485
シリーズ全体のベストプラクティス。

00:30:54.485 --> 00:30:55.790
だから、購読していることを確認してください

00:30:55.790 --> 00:30:57.695
今日はどこにいても
今すぐ見ています。

00:30:57.695 --> 00:30:59.090
私はジェームズ・モンテマーニョです。

00:30:59.090 --> 00:31:01.790
This has been The Xamarin
見ていただきありがとうございます。

00:31:01.790 --> 00:31:02.480
>> 皆さんありがとうございます。

00:31:02.480 --> 00:31:09.230
[音楽]

00:31:09.230 --> 00:31:11.120
>> ねえ、ジェームズはここ。
ちょうどチェックインしたかった

00:31:11.120 --> 00:31:13.175
そして、ありがとうございました
このビデオを見て。

00:31:13.175 --> 00:31:16.265
今、あなたはすべてのことを行います
あなたが好きなようにしたいことを知って、

00:31:16.265 --> 00:31:18.710
購読、および付き
その通知ベル,

00:31:18.710 --> 00:31:20.825
の一部になる
通知チーム。

00:31:20.825 --> 00:31:22.190
あなたがここにいる間、チェックアウト

00:31:22.190 --> 00:31:25.400
これらすべての素晴らしいビデオ
私はすでにコード化したことを。

00:31:25.400 --> 00:31:29.040
その事をクリックしてください。クリック
それを見て、それをしなさい。

