質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Xcode 7

Xcode 7は、ソフトウェア開発のためのアップルの統合開発環境であるXcodeのバージョン。UIを作成するために用いるグラフィカルツールです。iOS9/OS X El Capitan/watchOS2に対応。Swift 2コンパイラーが搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

6658閲覧

実機で動かした時に EXC_BAD_ACCESS が発生する

taratail

総合スコア76

Xcode 7

Xcode 7は、ソフトウェア開発のためのアップルの統合開発環境であるXcodeのバージョン。UIを作成するために用いるグラフィカルツールです。iOS9/OS X El Capitan/watchOS2に対応。Swift 2コンパイラーが搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2015/10/04 10:09

編集2015/10/05 07:47

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です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ARCは難しいので詳しくはわかりませんが、
全て強参照で管理してるから循環参照してメモリリークしてしまってるのではないですか?

イメージ的にはSubClassViewのaddSubViewがViewインスタンスを更新しようとして、
古いインスタンスの値をnullにしたのに参照元が強参照してるのでインスタンスが残りっぱなし。
にも関わらず、addSubViewが新しいインスタンスを立ち上げて参照に行った値が
古いインスタンスのnull値で BAD ACCESS って感じでしょうか。

全コードを見てないのでわかりませんが、インスタンスを代入する時は
弱参照で代入すると良い感じに動くのではないでしょうか。

参考:
【Swift】ハマりがちな循環参照について
http://qiita.com/1234224576/items/2241266f7d307cd25ba9
ARC
http://tea-leaves.jp/swift/content/arc

投稿2015/10/04 12:09

SKYYFISH

総合スコア654

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taratail

2015/10/05 07:00

回答をありがとうございます。リンクも読ませていただきつつ、現在循環参照問題を調査中です。 何か分かりましたらまた追記させていただきます。
taratail

2015/10/05 07:44

循環参照でもないように思えます。 インスタンスを保持している方に向けて、 ParentViewController -> SubViewController -> UIView |-> SubView -> UIView -----------------------------------^ となっています。
taratail

2015/10/06 02:10

解決方法は分かりましたが、それと同時に循環参照やARCの良い勉強になりました。ありがとうございました!
guest

0

自己解決

解決方法が分かりましたのでここに記載します。
dynamic frameworkが重複していたのか、コンパイルしても実機に正確に反映されていないことが原因でした。
一度フレームワークを全て削除して再度全てのフレームワークをビルドしなおした所、解決に至りました。
ご協力ありがとうございました。

投稿2015/10/06 02:08

編集2015/10/06 02:13
taratail

総合スコア76

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問