Raptor開発者ブログ

期限:2016年月日 やること:次のアプリをリリースする 資格の勉強法、アプリ開発、はてブロのカスタマイズのことを書きます!

初めてのiPhoneアプリ開発で、大変だったこと 4メモリリークとFMDB

 
 
iPhone宅建アプリをリリースするにあたり、絶対に乗り越えなければならないハードルが、今回書いたエラーでした。
 
 
Adnrdoiであれば、基本的にGooglePlayは審査なしでアプリをリリースできるので、たまにエラーが出るくらいでは公開取り消しにもなりません。

ところが、iPhoneアプリの場合、AppStoreにリリースする前に、appleの審査があります。
その審査基準の一つに、アプリが停止しないこと、というのが!
とすれば、エラーがたまに出る状態で申請しても、たっぷり時間をかけた上でリジェクトされるだけです。
 
 
そのため、なんとかこのエラーは解決しなければなりません。

  

エラーの原因は、メモリリーク

 
宅建アプリを作ってだいぶ後半になった頃、エラーが起きるようになりました。

そのエラーが発生する条件が、TOP画面からランダムボタンを押したときや、分野別や復習の問題リストから問題を選んだときや、問題を解く画面からTOP画面に戻ったときにエラーが生じるなど、バラバラです。

さらに、さきほどエラーが生じたときは、7回ほど画面を行き来したときだったのに、今回は15回ほど画面を行き来したところでエラーが起きた、という具合にバラバラなのです。

その上、エラーが発生したときのコードをみたり、それをキーワードにしてGoogleで検索しても、解決策がみつかりません。
 
 
となると、自分なりに分析してエラーの原因をさぐるしかありません。

これまでのandroidアプリ開発の経験を踏まえると、エラーのタイミングがバラバラだから、メモリ関係が原因の気が。
メモリの使用量が限界になってエラーとなると考えると、その時々でメモリの使用量は異なるため、バラバラなエラーのタイミングも説明がつきます。
 
そこで、メモリリークについて調べました。
 

ARC時代のメモリリーク対策

 
iOS5から本格的に使われるようになったのが、ARC(AutoReferenceCounting)。
これまでは、メモリ対策として、使わなくなったオブジェクトの参照を切るためにわざわざreleaseを自分で書かなければなりませんでした。
それが、ARCがあると、自動で参照を切ってくれるという!

ようするに、ARCを有効にすればメモリ管理は自動でやってくれるという!
 
とはいえ、ARCも完全ではありません。
そこで、手動で参照を切ることもあるらしいです。

例えば、画面遷移するときに、viewDidDisappearが呼ばれるので、その中で、ButtonやLabelにnilを入れて参照を切る。
さらに、[self.オブジェクト名 removeFromSuperview]でviewから外すという。

これを実践してみたところ、画面遷移するときに、TableViewが空っぽになったり、目に見えてメモリ使用量が減った気がしました!
 
あとは、for文やwhile文で繰り返し処理する文の中で、NSStringなどのオブジェクトを宣言する場合、auoreleasepool{}を書く。
他にも、循環参照を防ぐために、strongの変数=strongの変数にしないなど。

 
たくさんのサイトをみましたが、メモリ管理について、特にお世話になったのは、こちらの2つのサイトです!
ありがとうございました!
 qiita.com
 
 blog.it.churaumi.tv
 
 
 
 
さらに、エラーの原因をさぐるために、詳細なログが表示されるようにコードを追加する必要があります。
それについて、こちらのサイトのお世話になりました!
ありがとうございました!
 
http://www.zero4racer.com/blog/480www.zero4racer.com
 
 
 

エラーの原因は、メモリリークではなく、imageview

 
メモリ管理もやったところで、それでもエラーが解消されません。

今さらですが、冷静に考えてみると、まだシンプルな機能しかつけていないにもかかわらず、メモリリークが起こるはずがないです。
 
 
そこで、また別の原因をさぐることにしました。

ひとまず、現在リリースされている、他の宅建アプリを分析してみて、偶然エラーが発生することはないのか、検証してみました。
ところが、一切エラーが生じません。
そこで、他のアプリを分析したところ、共通点が見つかりました。
 
それは、問題を解く画面で、画像をほとんど使っていないというものです。
TOP画面では画像を使っているのですが、問題を解く画面では、デフォルトのボタン等を使っているアプリばかりです。
 
 
ひとまず、これらのアプリをマネしてみようと思い、問題を解く画面を変更することにしました。

まずはヘッダーを、これまではimageviewで画像を使っていたのですが、それを全てコードだけで表現するようにしてみました。
 
変更前(ヘッダーに画像を使っている)
f:id:raptor36:20150731195959p:plain:w200
 
変更後(ヘッダーがコードのみ)
f:id:raptor36:20150804170228p:plain:w200
 
 
そうしたところ、なんと、エラーが全く発生しなくなったのです!!
 
 
フッターの回答ボタンは、imagebiewではなく、buttonの背景として画像を使っているのですが、そちらは原因ではありませんでした。
 
どうやら、imageviewに何か原因があったようです。
いまだに、どういう理由か正確にはわかりませんが、imageviewには気をつけた方がいいです!
 
 

FMDBのちょっと注意すべきこと

 
iPhoneアプリでデータベースを使う場合、デフォルトで搭載されているCoreDataという選択肢と、ライブラリを導入するFMDBという選択肢があります。

CoreDataは、使いづらいと評判が悪いです。
それに対し、FMDBはすこぶる評判が高いので、FMDBを使っています。

ところが、FMDBを使っていたら、ログに大量のエラーがみつかりました!

原因はよくわかりませんが、while文の条件として[result next]をすると、このエラーがなくなります。
そのため、FMDBを使うときには、while([result next]){}がオススメです。
 
 
アプリが突然エラーになる原因がimageviewと判明するまでは、FMDBも疑っていました。
そのため、CoreDataにしなければいけない、と考えていたときもあったのです。
 
 
 
 
このようなこともありましたが、ついにエラーの原因がみつかり、それ以降エラーが発生しなくなりました!
エラーが解消されるまで、4日間を費やしました!
 
 
 

iPhone版 完全版のリジェクト!

 
 
 
8月12日に完全版を申請しました。

そして、今朝、審査がされ、リジェクトとなりました!


原因は、icloudに余計なファイルまで保存されているから、というもの!

自動でicloudに保存されているなんて知りませんでした!
そのため、自動でicloudに保存されないように修正いたしました!

さらに、審査されている間に、さらに完全版をブラッシュアップしていたので、それを申請することにします!


遅くなってしまい、申し訳ございません。
現在のバージョンで解いたデータは、今後リリースする完全版にも引き継げますので、ご安心ください。
審査が通るまで、あと1週間くらいかかると思いますので、もうしばらくお待ちいただけるとありがたいです。
 
 
 

iPhone版 宅建アプリの機能が完成!

 
 
 
ようやく、iPhone版の機能も、完全版になりました!
 
f:id:raptor36:20150812093933p:plain:w200
 
一歩手前のバージョンを、8月3日にリリースして
完全版を、8月12日に完成させました!

たった9日で完全版にできるとは思ってもみませんでした!


これで、「重要度」モードや「年度四択」モードも使えるようになります!

加えて、その日解いた問題数を自動で記録して、カレンダーに表示する機能もつきました!
 
 
 
この完全版は、今日から1週間後くらいにリリースされると思います!

もちろん、現在のバージョンで解いたデータは、完全版に引き継げますので、安心して現在のバージョンをご利用ください!!
 

 
 
 

QLOOKアクセス解析