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
其中之一是記憶體管理。

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
"他們要殺死
我的應用程式在五秒鐘。

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
我在Xamarin要點中有個蟲子

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
正確處理
本機 Android 物件，

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
* 所以我們有這個小
帶有兩個視窗的簡單應用程式，

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
現在一旦你和薩馬林一起工作

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
或任何靜態屬性
作為路線之一。

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
此連接更改
在第二頁。

00:07:11.910 --> 00:07:12.420
[ 第二頁。

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
我們只有四個處理常式
運行我們的代碼，

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
回去，並在一個星期內你的應用程式
崩潰，沒有人知道為什麼。

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
第二個是管理工具，

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
* 因此，讓我們來看看Xamarin探測器。

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
我們看到兩個細節控制器
掛在記憶中，

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
* 這是真正的Android以及。

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
所有的UIs，你會
獲得大量的記憶體。

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
我們在這裡看到三個實例。

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
取消訂閱，然後你
刪除頂部。

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
那也很有趣
因為一，它導致兩個問題。

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
即使它是薩馬林應用程式，

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
* 這是有道理的
因為薩馬林是土生土長的

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
* 所以這是非常相似
到Xamarin探測器，

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
讓我再做一次

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
* 這是三頁在這裡，

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
旋轉一次，得到兩個，

00:21:07.240 --> 00:21:11.655
這意味著我們有一些使用者介面視圖
控制器掛在記憶體中，

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
一周後，它可能會崩潰。

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
因此，它實際上要求
使用 NS 通知的操作。

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
回去吧，我們打一個
更多的時間和一次。

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
時間和哦，哇，我們
有五個實例

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
* 所以我們有兩個選擇，

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
在薩馬林 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
因此，我們只有一個視圖
控制器和委託。

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
點擊"記憶體快照"，我們看到一個。

00:28:56.975 --> 00:28:59.315
讓我再點擊幾次。

00:28:59.315 --> 00:29:02.735
我們來談談所以我們
這裡只有一個實例。

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 適用于安卓系統。

00:30:02.000 --> 00:30:02.150
#找到你。

00:30:02.150 --> 00:30:03.440
* 只是有不同的工具

00:30:03.440 --> 00:30:07.145
安卓原生探測器
稱為 Android 探測器。

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
Xamarin 探測器結合

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
這是薩馬林
顯示和感謝觀看。

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
點擊那東西。點擊
它，看著它，做它。

