2016年10月20日木曜日

コードで作ったオブジェクトが動かない時はARCを疑え

Storyboardで配置したUI部品(ボタンとかラベルとか)じゃなく、コードの中で作った部品が機能せず、「なんでじゃー!」と発狂したことなら皆さん何回かあると思います。

これって、本来はプロパティ(インスタンス変数)に保存しておかなけりゃいけないものを、関数の中だけのローカル変数に保存したばっかりに、関数を抜けた途端にARCが働いてガベージコレクションされちゃうからなのよね。
(実際にガベージコレクションするタイミングはARC任せだけど)

エラーやウォーニングが出るわけじゃないし、部品自体は画面に表示されたままだから、なんでじゃー! ってなるんだけど、iOSの仕組みを考えるとなるほどということになる。

UI部品ばかりじゃなく、音を鳴らすとかの場合にも、関数の中でサウンド関係のインスタンスを作って鳴らしたはずが鳴らなかったりするのは、やはり鳴り終えるまでガベージコレクションされない変数(要するにプロパティ)として保持しておかなきゃいけないのよね。

Storyboardで作ると自動的にプロパティが作られるので実感わかないけど、要はそういうこと。

0 件のコメント:

コメントを投稿