LoginSignup
12
10

More than 5 years have passed since last update.

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

Posted at

結論

表題の通り
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 のバグ
って感じの英語が見えたので俺は調べるのをやめたよ
もう俺は英語読みたくないんだ やめてくれ( ˘ω˘)

12
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
10