ARC」カテゴリーアーカイブ

IBOutlet の weak or strong 問題

xibファイルでユーザインターフェースを作成してクラスのプロパティに結びつける時に、

これを weak にするか strong にするか迷った。

ネットを漁ったら weak が好ましいようなことを書いてるのを見つけたのでそうしていたのだが、上記のようにカスタムテーブルセルをxibで作ってoutletで結びつけてテーブルに表示させる場合にweakだと落ちるケースがあった。

StoryboardでなくxibからTableViewControllerを作成し、カスタムセルをxib側で作成して propertyにIBOutletでつないでる場合、すぐには表示されないセクションの中のセルは weakだといつの間にか破棄されてnilになっていて、いざそのセルが必要になった時にはもうない、という事態が発生した。当然strongだとそうならない。

なのでこのケースについては strong でないといけないようだ。
Storyboardの時はしらん。
他の場合については循環参照の心配が無くもないのでケースバイケースだが、
「循環参照が心配だからとりあえずweakにしとけばオーケー」というワケではない場合もある
ので注意が必要ですよ。というおはなし。

ARCでstructの中にObjective-Cインスタンスを入れると出るエラーの回避方法

(2013.05.28)修正

ARCではstructの中にObjective-Cのメンバを入れると怒られる。

これ、Objective-CコンパイラではなくObjective-C++コンパイラを使うようにする、つまりファイルの拡張子の.mを.mmにするとエラーが出なくなる。

C++コンパイラwith ARC だと、struct/class内のObjective-Cインスタンスなメンバーはdestructorで自動的にreleaseされるようになる。コンパイラの管理下に置けるからエラーにならないのね。しかも、メンバ変数にインスタンスを代入すると自動的にretainされる。retainな@property的な挙動になる模様。

なんと素晴らしいことでしょう。

ただARC化するには、これらのARCでのC++クラス/構造体内のObjective-Cメンバ変数の挙動にを踏まえた上で、これまで自前でretainやreleaseしてたところを検証していかなければならないので面倒っちょいは面倒っちょいが、まあ、structのままでARC化する道はあるってことで。