Adobe Flash Professional CS6 でiOSアプリを開発する際メモリリークでアプリが急に落ちることがあります。場合によってアプリが起動できない場合もあります。その直接原因はメモリリークだと思いますが、リークする原因はAirSDKの問題かiOS自身の問題かはっきり分かりませんが、コードの書き方によりその問題を回避することもできます。
メモリリークといえば、宣言した変数、オブジェクトなどがGCがメモリを回収する際参照回数が1以上であれば、そのオブジェクトは回収対象にならなくて残ってしまいリークが始まるんです。
通常Flash PlayerまたはAIRから自動的にGCを行っています。Air for iOSも同様だと思いますが、ある特定の条件でGCする際アプリが落ちてしまいます。
例えば次のMySubMovというインスタンスを使ってnullにしなかった場合、メモリリークが起きてしまいます。
public class MySubMov extends MovieClip {
var myVar:Number;
var myInt:int;
var myStr:String;
}
Air SDKから開発したiOSアプリのメモリリークを検知する方法としてSystem.gc()(強制GC)を実行する方法があります。リークが始まる最中にSystem.gc()するとアプリがすぐ落ちますので、System.gc()をうまく使えばリークする場所を特定することができます。
上記のクラスのリークする直接原因はNumber型の変数を利用してnullで開放してないからです。
ActionScript3でNumberのデフォルト値はNaNで、nullではない、それが原因でしょうか、Air for iOSのNumber型に対するGCにはバグ?が有りかもしれないので、Air SDK for iOSでアプリを開発する際Number型の使用に気をつけましょう。浮動小数点はAction Script3版のBigDecimalを使ったほうがいいと思います。そしてできれば、クラスごとにdispose()メソッドを用意し、使い終わったオブジェクトについては必ずdispose()しましょう。
More than 5 years have passed since last update.
Register as a new user and use Qiita more conveniently
- You get articles that match your needs
- You can efficiently read back useful information
- You can use dark theme
List of users who liked
11