コース: Objective-C 基本講座

今すぐコースを受講しましょう

今すぐ登録して、23,200件以上登録されている、業界エキスパート指導のコースを受講しましょう。

相互参照を回避する

相互参照を回避する

このレッスンでは相互参照問題を紹介します 参照カウントの仕組みはプログラマーから オブジェクトの片付けというわずらわしい作業 をなくしてくれて大変ありがたいのですが 厄介な点が1つあります オブジェクトが互いに参照し合う状態です 試しにやってみましょう Xcode の画面に切り替えます Event クラスに別のEvent クラス を参照するためのプログラムを用意し 2つ作成したEvent クラスを 互いに結びつけてみます まず最初は問題点を確認するために 互いではなく片方だけ参照させてみます オブジェクトが片付けられる時に呼ばれる ディアロックでコンソールに 「メモリから消えます」と出力させているので 正しく片付いていくなら このメッセージが出るはずです 出ました では今度は もう1 人にも相手を参照させてみましょう たったこれだけの作業ですがランさせると 「メモリから消えます」が 出力されなくなります 確認したので解説画面に戻ります この問題はEvent A Event B の変数が片付いても互いの プロパティの参照が残ってしまうのが原因です 相互参照問題などと呼ばれます この問題を解決する1つの方法として どちらかのフレンドプロパティを nill に設定した後で Event AEvent Bをnill にするといった順番で解決する方法があります 例えばEvent A 側の フレンドプロパティをnill にしておくと Event A Event B どちらが 先にnill またはスコープ外になっても Event インスタンスは解放されます ただそうそううまく 順序を守れるものではありません もう1 つの方法はフレンドプロパティ の属性にweak を指定する方法です weak を指定された オブジェクト参照プロパティは 参照はするけれどカウントを増加させません これならお互いに片付きます weak は変数でも指定可能です こちらは手前にアンダースコアを 2 つ続けたweak を型の前に書きます ではフレンドプロパティの属性に weak を指定してみましょう Xcode の画面に切り替えます ランすると無事 「メモリから消えます」が表示されました このレッスンでは相互参照を紹介しました

目次