ARCの基本:strong / weak / unowned
ARCによる参照カウントと、メモリリークを防ぐために strong 、 weak 、 unowned を使う場面を学びます。
「ARCの基本:strong / weak / unowned」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン1/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全3レッスンが含まれています。
1分でわかるARC
SwiftはARC(自動参照カウント)を使用します。各strong参照によってクラスインスタンスの参照カウントが1増えます。カウントが0になると、deinitが実行され、メモリが解放されます。
strongがデフォルト
Strongがデフォルトです。最後のstrong参照がなくなると、deinitが呼び出されます。
final class Person {
let name: String
init(_ name: String) { self.name = name; print("init:", name) }
deinit { print("deinit:", name) }
}
var p: Person? = Person("Ada")
p = nil // ARC count -> 0, triggers deinit循環参照の例
双方向のstrong参照は循環参照を作ります。ARCでは解放できないため、メモリリークの原因になります。
final class A {
var b: B?
deinit { print("A deinit") }
}
final class B {
var a: A?
deinit { print("B deinit") }
}
var a: A? = A()
var b: B? = B()
a?.b = b // strong
b?.a = a // strong
a = nil // no deinit (cycle)
b = nil // still no deinit (leak)weak参照
片方をweakにして循環参照を避けます。weak参照はオプショナルで、オブジェクトの割り当てが解除されると自動的にnilになります。
final class A2 {
weak var b: B2? // weak breaks the strong cycle
deinit { print("A2 deinit") }
}
final class B2 {
var a: A2?
deinit { print("B2 deinit") }
}
var a2: A2? = A2()
var b2: B2? = B2()
a2?.b = b2 // weak
b2?.a = a2 // strong
a2 = nil // A2 deinit runs
b2 = nil // B2 deinit runsunowned参照
参照先のオブジェクトがこの参照よりも長く存続することが保証される場合はunownedを使います。これは非オプショナルで、nilには設定されません。割り当て解除後にアクセスするとクラッシュするため、ライフタイムを保証してください。
final class Customer {
let name: String
var card: CreditCard?
init(_ name: String) { self.name = name }
deinit { print("Customer deinit") }
}
final class CreditCard {
unowned let owner: Customer // never optional; owner must outlive card
init(owner: Customer) { self.owner = owner }
deinit { print("CreditCard deinit") }
}
var cust: Customer? = Customer("Lars")
cust!.card = CreditCard(owner: cust!)
cust = nil // deallocates both (no cycle)ヒントとパターン
ヒント:
- デフォルトではstrongにします。
- weakで循環参照を解消します(delegateは一般的にweakにします)。
- ライフタイムが保証される場合にのみunownedを使います(例: 子 → 親)。
- クラスは参照型です。structやenumにはARCのルールは必要ありません。
weakとunownedの違い?
理解度チェック: weakとunownedはどのように使い分けますか?
まとめ
まとめ: ARCはstrong参照が残っていないときにオブジェクトを解放します。weak(オプショナル)またはunowned(ライフタイムを保証)で循環参照を防ぎます。安全性を保てる最小限の所有関係を選びます。
よくある質問
「ARCの基本:strong / weak / unowned」レッスンは無料ですか?
はい。「ARCの基本:strong / weak / unowned」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全3レッスンが含まれています。
「ARCの基本:strong / weak / unowned」で何を学びますか?
ARCによる参照カウントと、メモリリークを防ぐために strong 、 weak 、 unowned を使う場面を学びます。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Swift Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/3です。
「ARCの基本:strong / weak / unowned」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSwift Academyレッスンでコードを書いて実行できますか?
はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- ARCの基本:strong / weak / unowned
- 循環参照とweak/unownedによる解消
- 共有を減らすための値型