Я только что последовал за учебником по ARC и был обеспечен этим кодом.ARC и как он работает точно.
Следующий класс ViewController и под ним класс Vehicle.
Что я получил от этого, так это то, что ARC по существу отслеживает экземпляр класса и выделяет для него часть памяти. Когда создаются «сильные» ссылки для экземпляра, arc увеличивает приращение количества ссылок на экземпляр. После того, как все они установлены на nil, ARC освобождает экземпляр из памяти. Инструктор также сказал что-то вроде того, как только все ссылки не используются, он освобождается из памяти. Я не совсем понял, в какой части они «не используются», поэтому я решил добавить кнопку, которая представляет собой другой контроллер View, который не содержит кода. Я подумал, что если я перейду к следующему контроллеру представления, deinit будет вызван как ссылка в контроллере 1, теперь не используются и, следовательно, освобождаются из памяти. Это было не так, и деинит не вызвал. Поэтому мне интересно, действительно ли ссылки остаются в памяти, если вы не установите их на ноль, всегда?
Часть 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