参照カウントの挙動も変わっているのだろうか?

注意: この記事は1年以上前に掲載されたものです。情報が古い場合がありますのでお気を付け下さい。

iOSやmacOSで使われているSwiftでは、参照カウントによるメモリー管理が行われているが、その参照カウントが行われているタイミングについてはなかなかわからないところがある。もっとも、これはObjective-C+ARCでもそうだったと言えばそうなのだが。

とあるライブラリーで、iOS 10まではあるオブジェクトがnilになっていなかったため、問題なく動いていたのに、iOS 11ではnilになっていてクラッシュするというトラブルがあった。その原因の検証のために、以下のコードを書いて見た。

import Foundation

class A {
    var num = 0
    func printNum() {
        print("\(num)")
    }
}

class B {
    var ref: A?
}

class C {
    weak var ref: A?
}

var objB = B()
var objC = C()
objB.ref = A()
objC.ref = objB.ref
objC.ref?.printNum()
objB.ref = nil
objC.ref?.printNum()

このパターンではobjB.ref = nilにした後は必ずobjC.refは解放されているので、nilになるのだが、このような書き方をしているコードでもGUIアプリ内のライブラリーの挙動によっては必ずしもそういう風にはならないことがあるらしく、正常に動いてしまうというようだ。

参照カウントの挙動においても、OSのバージョンの違いで違うことがあるらしく、思わぬトラブルを避けるためにも、怪しいコードの書き方をしていないか気をつけたい。

タイトルとURLをコピーしました