読者です 読者をやめる 読者になる 読者になる

しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

Swift再入門17 − The Swift Programming Languageを読んでみる

この記事では「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]は不要になります。