注意: この記事は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のバージョンの違いで違うことがあるらしく、思わぬトラブルを避けるためにも、怪しいコードの書き方をしていないか気をつけたい。
ウェブマスター。本ブログでITを中心にいろいろな情報や意見などを提供しています。主にスマートフォン向けアプリやウェブアプリの開発を携わっています。ご用の方はコメントかコンタクトフォームにて。