【Swift】autoreleasepoolの使い方!ループ処理のメモリ節約方法

この記事からわかること

  • Swiftautoreleasepoolとは?
  • メモリ節約方法

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

環境

autoreleasepoolとは?

公式リファレンス:NSAutoreleasePool

SwiftのautoreleasepoolメソッドはObjective-C時代のメモリ管理を手動で起こっていた際に活用されていた@autoreleasepoolと同じく特定のスコープ内で生成されたオブジェクトを解放する役割を持つようです。

例えばループ内で生成したオブジェクトなどをスコープを抜けるごとに適切に解放することでメモリ消費が増大しないように抑制することができます。


@autoreleasepool  {
    NSData *data = [[NSData alloc] initWithContentsOfFile:@"path/to/large/file"];
}

しかしSwiftのメモリの仕組みであるARC(Automatic Reference Counting)の導入から手動でのメモリ管理ではなく、自動でメモリの確保と解放を行なってくれるようになりました。ARCではメモリを解放するタイミングはガーベジコレクションの要領でそのメモリへの参照が0になったタイミングで行うようです。

それでも循環参照などでメモリリークが発生することがあるので、適切なメモリ制御は必要になっています。

Swiftのautoreleasepool

Swiftではループ内で著しく大きなデータを扱う時などに効果を発揮することがあるようです。例えば以下のような場合でしょうか?

実際に以下のようにループ内でインスタンスを生成してみました。以下の処理をautoreleasepoolの有/無で実験してみたところ以下程度であれば、メモリは両者に違いはなく、autoreleasepool有ではCPU使用率が逆に高まってしまう結果になりました。

for _ in Array(1...1000000) {
    autoreleasepool {
        let test = Test()
        let test2 = Test()
    }
}

画像を加工する処理を試してみる

次に重たい処理として画像を合成する処理を挟んでみます。

for _ in Array(1...1000000) {
    autoreleasepool {
        let image = UIImage(named: "AppIcon")
        // 独自実装の画像に文字を追加するメソッド
        imageStampPlacement(img: image ?? UIImage(), stampText: "Hello")
    }
}

この結果では有りの方はメモリ消費量がずっと30MBなのに対し、無しの方は処理が走っている間にメモリ消費量がずっと鰻登りに上昇していきました。画像加工のような重たい処理の場合は有りの方が大きくメモリ消費を抑えられていることがわかりました。

autoreleasepool有

【Swift】autoreleasepoolの使い方!ループ処理のメモリ節約方法

autoreleasepool無

【Swift】autoreleasepoolの使い方!ループ処理のメモリ節約方法

autoreleasepoolはメモリ消費を抑えることができるメソッドですが使いどきを見極めることが大事なようです。

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index