我剛剛在ARC上提供了一個教程,並提供了此代碼。ARC以及它如何工作。
以下ViewController類及其下面的Vehicle類。
我從中得到的結果是,ARC基本上追查一個實例化的類併爲它分配一塊內存。由於創建實例的「強」引用,因此增加了實例有多少引用的增量。一旦所有這些設置爲零,ARC就會從內存中釋放該實例。教練還說了一些話,一旦所有的引用沒有被使用,它就從內存中釋放。我並不完全理解它們沒有被「使用」的部分,所以我決定添加一個按鈕,該按鈕顯示另一個視圖控制器,這些視圖控制器空白且沒有代碼。我想如果我導航到下一個視圖控制器,deinit將被視爲視圖控制器1中的引用,現在不會被使用,因此會從內存中釋放。事實並非如此,並且deinit並沒有被調用。因此,我想知道,除非將它們設置爲零,否則引用會留在內存中嗎?
問題的第2部分:另外,當你回答這個問題時,我也有另一個問題,我也想知道ARC是否僅適用於類實例並引用它,因爲我看過的每一篇文檔或教程似乎只提到類實例。例如,如果我設置了var number = 2 var othernumber = number
,「號碼」是否也存儲在內存中,並且只有在所有對它的引用都爲零之前才被釋放。如果情況也是如此,那麼同樣的問題適用,即將所有引用設置爲等於從內存釋放的唯一方式?對於冗長的問題抱歉,但對於內存概念我很新穎。
import UIKit
class ViewController: UIViewController {
var ref1: Vehicle?
var reference2: Vehicle?
var ref3: Vehicle?
var timer: NSTimer!
var count = 0
override func viewDidLoad() {
super.viewDidLoad()
ref1 = Vehicle(kind: "Car")
reference2 = ref1
ref3 = ref1
timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: #selector(tick), userInfo: nil, repeats: true)
}
func tick() {
count++
if count >= 3 {
ref3 = nil
reference2 = nil
}
if count == 5 {
ref1 = nil
}
}
}
class Vehicle {
let type: String
init(kind: String){
self.type = kind
print("\(type) is being initialized")
//when the class is instantiated, we get an initialization message. When class is deallocated, we get a deinit message. As in, all strong references are gone, we can deinitialize.
}
deinit {
//class vehicle not in memory anymore as all strong references to it have been destroyed. This will be tested with segue as well.
print("\(type) is being deinitialized")
}}
感謝清除那個Rob,儘管在什麼情況下,一個強烈的引用會落在「超出範圍」 – slimboy
同樣,我猜測值類型,它們也被分配到內存和釋放。程序員是否必須自己釋放它們才能保留內存空間? – slimboy
謝謝你清理那個,我現在明白了。 – slimboy