dynamic frameworkを利用しています。framework内でのUIViewのサブクラス内で適当な関数を呼んだ時に、EXC_BAD_ACCESSの例外を吐いてしまいます。
サブクラス内にpublic func reloadData()という関数を作り、それを外部から呼び出し実機で実行した所、addSubview()をしている行で例外が発生したため、addSubview()をコメントアウトしました。すると今度はその行よりも上方(先のコメントアウト前では通過していた行)で同じ例外が発生したため、例外が発生している行を正しく特定できないのだと考えました。
例外を履いているUIViewのサブクラスのインスタンスを持つ別のdynamic framework上で、そのサブクラスをweak参照をしているようなことはなく強参照管理しています。、Implicitly Unwrapped Optionalにはなっているものの、例外を吐く関数を呼び出すすぐ上方でサブクラスのインスタンスを確保しています。
具体的にコードでは以下ようになっています。
Swift
1FrameworkA 2import FrameworkB 3... 4 private var aView: FrameworkBSubClassView! 5 6 override public func viewDidLoad() { 7 aView = FrameworkBSubClassView(frame: view.bounds) 8 ... 9 aView.reloadData() // ここをコメントアウトすると正常に動作する。命名がreload()でも同じ結果。 10 } 11... 12 13FrameworkB 14... 15 override public init(frame: CGRect) { 16 super.init(frame: frame) 17 18 let anImage = UIImage(...)!... 19 someMember = CGRectMake(...) 20// このinit(frame:)は正しく実行されている様子。 21 } 22 23 public func reloadData() { 24 return // ここで return しても、returnをすり抜けて下方、例えば、最終行のaddSubview(...)でエラーを起こす。 25 ... 26 addSubview(...) // ここなどでエラー(最終行)コメントアウトしても、この関数内の適当な所でエラーを起こす。 27 } 28...
原因と解決策をご教示ください。
追記
循環参照も考えてみましたが、
ParentViewController -> SubViewController -> UIView
|-> SubViewA -> UIView -----------------------------------^
というような構造はありましたが、ループしていません。
また、何故上にような構造になっているかというと、ParentViewControllerが Custom Container View Controller だからです。SubViewADelegateというプロトコルを利用して、SubViewController内のUIViewをSubViewの中から参照しています。もちろんDelegateは全てweakです。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/10/05 07:00
2015/10/05 07:44
2015/10/06 02:10