iOS9 SDKではUIGestureRecognizerのターゲットに弱い参照を使っている?

注意: この記事は1年以上前に掲載されたものです。情報が古い場合がありますのでお気を付け下さい。

どうやらiOS9 SDKではUIGestureRecognizerのtargetを内部的には弱い参照に切り替えているようだ。そのため、何らかの形でtargetに弱い参照を禁止したクラスをセットするとクラッシュが発生する模様である。

これは基本的にはiOS9への以降の際には問題になることはないはずなのだが、一部のクラスや何らかのプロトコルを適用したクラスなどでは弱い参照を許容しないというものがあり、それらを指定した場合、以下のExceptionが発生してクラッシュする。

objc[(行数)]: Cannot form weak reference to instance (アドレス) of class (クラス名). It is possible that this object was over-released, or is in the process of deallocation.

正直なところ、どういうクラス、あるいはどういうプロトコルを適用したら弱い参照を禁止になるのかについてはブラックボックス状態であり、当方でも見当がつかない状態である。

一時しのぎかつ強引な対処方法だが、問題のクラスの実装部分に以下を追加することである。

[code lang=”objc”]- (BOOL)allowsWeakReference {
return YES;
}[/code]

これで弱い参照が許容されるので、クラッシュ自体は免れるはずだ。

この方法はリジェクトを喰らうリスクが高まるため個人的には非推奨である。

タイトルとURLをコピーしました