( ˘ω˘).。oO(Apple が用意したアラートを使うとメモリリークするのでやめよう...)

  • 11
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

結論

表題の通り
UIAlertViewUIAlertController を使用しないで自作するか、
使用していないライブラリを使用しよう・・・
( ˘ω˘).。oO(RINGO KUTABARE)

経緯

UIAlertView はリークするみたいだし(参考:http://mokyu.game-ss.com/it%E9%96%A2%E9%80%A3/uialertview%E3%81%AB%E3%81%A6%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%AF%E7%99%BA%E7%94%9F-ios8-)
そもそも非推奨なので、UIAlertController を使おう

MyViewController.m

- (void)doAlert
{
    // 考えうる限りの最小のアラート表示処理でテスト
    UIAlertController *ac = [UIAlertController alertControllerWithTitle:@"title" message:@"message" preferredStyle:UIAlertControllerStyleAlert];
    [ac addAction:[UIAlertAction actionWithTitle:@"ok" style:UIAlertActionStyleDefault handler:nil]];
    [self presentViewController:ac animated:YES completion:nil];
}

Instruments で確認したら、OK 押した時に UIAlertView と同じくらいリークしてる・・・
変数 ac の代わりに UIViewController を設置した時は問題がない
(´・ω・`)・・・?

http://stackoverflow.com/questions/26247221/ios-8-only-memory-leak-with-uialertcontroller-or-uiactionsheet/30312928#30312928

英語がちゃんと読めないけど、
UIAlertController でメモリリークが発生したけど、iOS のバグだよ(1年前)
ってことが書いてると思う きっとそう
なんにせよ現状(2016年1週間前)で漏れてるわけで・・・もう解決策探すの嫌なわけで・・・

(´;ω;`)2度とアップルのアラートつかわん

おまけ

一応 UIAlertController をプロパティに保存しといて破棄せずに呼び出す
なら、リークはしないでアラートを使用することができる
(presentViewController で呼んだアラートが破棄される時にリークしてんだね)

が、UIAlertController は タイトル、メッセージは変更できるが
UIAlertAction は 追加し続けることしかできない
だめだこりゃ
やりようはあるだろうけど、そこに労力をつぎ込むなら頭に書いた結論を遂行したほうが早い・・・


Instruments の出し方は、とりあえず Xcode でビルドして、Debug SessionMemory を開いて、
そこにある Profile in Instruments をクリックするとなんかウィンドウが開くよ
あとは上に書いてるコードを実行してアラートを開いたり閉じたりすれば、赤いチェックマークがついてリークしてるよってでるよ

これは iOS8.4 の端末ではできたんだけど
iOS9 の端末ではなぜかできなかったよ
検索かけたらまた
iOS9 のバグ
って感じの英語が見えたので俺は調べるのをやめたよ
もう俺は英語読みたくないんだ やめてくれ( ˘ω˘)