私はARCのチュートリアルをたどり、このコードを提供しました。ARCとその仕組み
次のViewControllerクラス、その下にVehicleクラスがあります。
私が得たことは、ARCが本質的にインスタンス化されたクラスを追跡し、そのためのメモリを割り当てることでした。インスタンスの「強い」参照が作成されると、円弧はインスタンスへの参照数を増やします。それらのすべてがnilに設定されると、ARCはそのインスタンスをメモリーから割り振り解除します。インストラクターはまた、すべての参照が使用されていないときには、メモリから割り当てを解除します。私は彼らが "使用されていない"部分をよく理解していなかったので、コードなしの別のView Controllerを表示するボタンを追加することにしました。次のビューコントローラに移動すると、ビューコントローラ1の参照としてdeinitが呼び出され、現在は使用されていないためメモリから割り当てが解除されると考えました。これは事実ではなく、裁判官は呼ばれなかった。したがって、私はあなたがそれらを無制限に設定しない限り、リファレンスは記憶に残っているのだろうかと疑問に思っています。
質問2:また、あなたはその質問に答える一方で、私も別のものを持っていました。私が見たドキュメンテーションやチュートリアルクラスインスタンスだけに言及しているようです。たとえば、私がvar number = 2 var othernumber = number
を設定した場合、メモリにも "number"が格納され、すべての参照がnilになるまで割り当てが解除されます。これも当てはまる場合、同じ質問が適用されます。すべての参照をnilと同じに設定してメモリからの割り当てを解除する唯一の方法です。長い質問を申し訳ありませんが、私はメモリの概念に全く新しいです。
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")
}}
どのようなシナリオでは、どのようなシナリオで「範囲外」になるのか、ありがとうと思います。 – slimboy
また、私はValue型を推測していますが、それらもメモリに割り当てられ、割り当てが解除されています。プログラマはメモリ空間を確保するために自分で割り当てを解除する必要がありますか? – slimboy
これをクリアしてくれてありがとう、私は今それを得る。 – slimboy