問題を解決する方法を見つけましたが、なぜ機能しないのか理解したいのですが、意味が分かりません。私は住所をジオコーディングするCoreLocationを使用して、簡単なtodolistのアプリケーションを開発するために本を、次のよCLPlacemarkを拡張するときのEXC_BAD_ACCESS - 定義スコープ外の変数にアクセスしました
import XCTest
import CoreLocation
class ExampleTests: XCTestCase {
var okay: ext!
// this test works fine
func testOkay(){
okay = ext()
XCTAssertNotNil(okay)
}
// this test crashes with EXC_BAD_ACCESS(code=1, address=0x10)
func testNotOkay(){
let notOkay: ext
notOkay = ext()
XCTAssertNotNil(notOkay)
}
}
extension ExampleTests {
class ext : CLPlacemark{
}
}
:ここに私の問題を示して最小限の例です。テストの一環として、ジオコーディング機能をテストするための模擬CLPlacemarkオブジェクトを作成する必要がありました。
にはがありました。そうでなければ "テストはその定義スコープの外でアクセスされているのでテストがクラッシュする"ため、このモックの変数をTestクラスのプロパティとして宣言すると言われました。
これは、上記の例で確認できます。 okay
がクラスプロパティとして宣言されたため、testOkay()
は正常に動作します。 testNotOkay()
がEXC_BAD_ACCESS
エラーでクラッシュします。これは、関数内でext
の新しいインスタンスをインスタンス化しようとしたためです。私はCLPlacemarkを拡張しない場合
さて、問題は消える - すなわち私は関数の中で、あるいはまったく問題にクラスのプロパティとしてタイプext
の変数を宣言することができます。
ここでは何が起こっていますか?最初のものが動作している間に2番目の例がクラッシュする理由はありません。実際のコードでは、1つまたは2つの関数でのみ使用されている場合、クラスのプロパティとして擬似目印インスタンスを宣言することは些細なことです。この問題を引き起こしているスウィフトについて私が理解していないものがなければならない。
ありがとうございます!
見つけグッド!私はこのことを考え出すことをあきらめた。情報をありがとうございます:)それで、 'testNotOkay'関数が終了した後にインスタンスの割り当てを解除しようとするとクラッシュするようです。 –