この記事では「The Swift Programming Language」を1から読んだ感想とか発見を書いてみようと思います。
「The Swift Programming Language」とはSwiftの公式ドキュメントでiBooksや下ページで見る事ができます。
The Swift Programming Language (Swift 2.1): About Swift
読んだ所
今回はAutomatic Reference Counting
という項目を読みました。
The Swift Programming Language (Swift 2.1): Automatic Reference Counting
学んだこと
weakとonownedの違い
Like weak references, an unowned reference does not keep a strong hold on the instance it refers to. Unlike a weak reference, however, an unowned reference is assumed to always have a value. Because of this, an unowned reference is always defined as a nonoptional type. You indicate an unowned reference by placing the unowned keyword before a property or variable declaration.
違いですが、unowned
は常に値をもっているとの事です。
おそらくweakは変数のリファレンスカウントが0になった時にnilを入れるけどunowned
は参照を持ちっぱなし。
その為unowned
な変数にアクセスするとクラッシュするケースがあるようです。
weakとunownedの違いを調べたのですが、weakは下の2つの制限がありました。 裏側でnilを代入する為にこのような制限があるかと思われます。
- letで宣言できない
- Optionalにしなければいけない
class Person { weak let value1: NSDate? = NSDate() // これはletなのでエラー weak var value1 = NSDate() // これはオプショナルでないのでエラー unowned let value2 = NSDate() // エラーにならない }
[unowned self]
ブロック内でselfのプロパティーを使う場合は下のように[unowned self]を宣言する必要があります。
a = { [unowned self] (a: NSDate) -> String in let date = self.date return "\(self.date)h" }
[unowned self]がない場合、メモリリークを起こします。 ブロックでselfを使わない場合は[unowned self]は不要になります。