首页 > 解决方案 > 如何初始化 CLLocationCoordinate2D 结构

问题描述

我正在尝试从 Swift Playground 初始化 CLLocationCoordinate2D,但出现错误:

错误:执行被中断,原因:信号 SIGABRT。进程一直停留在被中断的地方,使用“thread return -x”返回表达式求值前的状态。

不知道我做错了什么。这是我尝试过的:

var temporaryCoordinate = CLLocationCoordinate2D(latitude: 0.0, longitude: 0.0)

标签: iosswiftswift3core-location

解决方案


您发现了一个非常不寻常且有趣的错误。我可以通过在空白 iOS 游乐场中运行以下代码来重现您的问题:

import UIKit
import CoreLocation

var temporaryCoordinate = CLLocationCoordinate2D(latitude: 0.0, longitude: 0.0)

问题出在运行时环境 Playground 本身正在崩溃。在 Mac 中,在控制台应用程序中,使用 Crash Reports 左侧选项卡,我们可以看到 Xcode Playground 正在崩溃。

Process:               scratch-playground [1696]
Path:                  /Users/USER/Library/Developer/XCPGDevices/D22341D9-BFF3-4575-9801-1405F0AA2EA2/data/Containers/Bundle/Application/67A50F6D-18E8-4220-A2EB-8673018601AA/scratch-playground-1381-1.app/scratch-playground
Identifier:            scratch-playground
Version:               1.0 (1)
Code Type:             ARM-64 (Native)
Parent Process:        ??? [1697]
Responsible:           SimulatorTrampoline [635]
User ID:               501

Date/Time:             2021-04-06 21:43:05.608 +0100
OS Version:            macOS 11.2.3 (20D91)
Report Version:        12
Anonymous UUID:        BFEAE183-A757-B843-D9D2-BF254A4665C2


Time Awake Since Boot: 6300 seconds

System Integrity Protection: enabled

Crashed Thread:        0  Dispatch queue: com.apple.main-thread

Exception Type:        EXC_CRASH (SIGABRT)
Exception Codes:       0x0000000000000000, 0x0000000000000000
Exception Note:        EXC_CORPSE_NOTIFY

External Modification Warnings:
Debugger attached to process.

Application Specific Information:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[NSValue valueWithMKCoordinate:]: unrecognized selector sent to class 0x1c9d3f588'
terminating with uncaught exception of type NSException
abort() called
CoreSimulator 732.18.6 - Device: iPad Pro (9.7-inch) (D22341D9-BFF3-4575-9801-1405F0AA2EA2) - Runtime: iOS 14.4 (18D46) - DeviceType: iPad Pro (9.7-inch)

Application Specific Backtrace 1:
0   CoreFoundation                      0x00000001803f61fc __exceptionPreprocess + 236
1   libobjc.A.dylib                     0x000000018016a438 objc_exception_throw + 56
2   CoreFoundation                      0x00000001804053bc __CFExceptionProem + 0
3   CoreFoundation                      0x00000001803fa45c ___forwarding___ + 1408
4   CoreFoundation                      0x00000001803fc42c _CF_forwarding_prep_0 + 92
5   libswiftCoreLocation.dylib          0x00000001b1f98044 $s12CoreLocation39CLLocationCoordinate2DInNSValueObjCType33_25AD2332B1DC67E23B54508C4A7DAD45LLSPys4Int8VGvpfiAFyXEfU_ + 104
6   libswiftCoreLocation.dylib          0x00000001b1f97fcc globalinit_33_25AD2332B1DC67E23B54508C4A7DAD45_func0 + 12
7   libdispatch.dylib                   0x0000000180100c48 _dispatch_client_callout + 16
8   libdispatch.dylib                   0x0000000180102300 _dispatch_once_callout + 28
9   libswiftCore.dylib                  0x000000018eed4ee8 swift_once + 44
10  libswiftCoreLocation.dylib          0x00000001b1f9817c $sSo22CLLocationCoordinate2DVs21_ObjectiveCBridgeable12CoreLocationsACP09_bridgeToC1C01_C5CTypeQzyFTW + 116
11  libswiftCore.dylib                  0x000000018eeac510 _ZL37bridgeAnythingNonVerbatimToObjectiveCPN5swift11OpaqueValueEPKNS_14TargetMetadataINS_9InProcessEEEb + 360
12  libswiftCore.dylib                  0x000000018ec10d70 $ss27_bridgeAnythingToObjectiveCyyXlxlF + 184
13  PlaygroundLogger                    0x0000000100c6f9f8 globalinit_33_86996C1BC443F28F24E6A34F24210E4B_func8 + 2132
14  PlaygroundLogger                    0x0000000100c6c848 globalinit_33_B1F54B50FE3698781248948D54A93147_func6 + 520
15  PlaygroundLogger                    0x0000000100c6db44 playground_log_hidden + 276
16  ???                                 0x0000000100c34350 0x0 + 4307764048
17  scratch-playground                  0x0000000100ac2ea4 main + 0
18  CoreFoundation                      0x0000000180365254 __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 20
19  CoreFoundation                      0x00000001803644ec __CFRunLoopDoBlocks + 404
20  CoreFoundation                      0x000000018035eda8 __CFRunLoopRun + 780
21  CoreFoundation                      0x000000018035e58c CFRunLoopRunSpecific + 572
22  GraphicsServices                    0x000000018b9c2740 GSEventRunModal + 160
23  UIKitCore                           0x00000001843ccbf0 -[UIApplication _run] + 964
24  UIKitCore                           0x00000001843d19d0 UIApplicationMain + 112
25  scratch-playground                  0x0000000100ac2f7c main + 216
26  libdyld.dylib                       0x0000000180223cbc start + 4

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0   libsystem_kernel.dylib          0x00000001bd7c3c10 __pthread_kill + 8
1   libsystem_pthread.dylib         0x00000001bd7fc034 pthread_kill + 260
2   libsystem_c.dylib               0x00000001800f378c abort + 100
3   libc++abi.dylib                 0x000000018021cf20 abort_message + 128
4   libc++abi.dylib                 0x000000018020ef1c demangling_terminate_handler() + 296
5   libobjc.A.dylib                 0x000000018016a6e8 _objc_terminate() + 124
6   libc++abi.dylib                 0x000000018021c3c0 std::__terminate(void (*)()) + 16
7   libc++abi.dylib                 0x000000018021c358 std::terminate() + 44
8   libdispatch.dylib               0x0000000180100c5c _dispatch_client_callout + 36
9   libdispatch.dylib               0x0000000180102300 _dispatch_once_callout + 28
10  libswiftCore.dylib              0x000000018eed4ee8 swift_once + 44
11  libswiftCoreLocation.dylib      0x00000001b1f9817c protocol witness for _ObjectiveCBridgeable._bridgeToObjectiveC() in conformance CLLocationCoordinate2D + 116
12  libswiftCore.dylib              0x000000018eeac510 bridgeAnythingNonVerbatimToObjectiveC(swift::OpaqueValue*, swift::TargetMetadata<swift::InProcess> const*, bool) + 360
13  libswiftCore.dylib              0x000000018ec10d70 _bridgeAnythingToObjectiveC<A>(_:) + 184
14  com.apple.dt.PlaygroundLogger   0x0000000100c6f9f8 0x100c68000 + 31224
15  com.apple.dt.PlaygroundLogger   0x0000000100c6c848 0x100c68000 + 18504
16  com.apple.dt.PlaygroundLogger   0x0000000100c6db44 playground_log_hidden + 276
17  ???                             0x0000000100c34350 0 + 4307764048
18  com.apple.dt.playground.stub.iOS_Simulator.scratch-playground-10BCB7AC-7E28-4D75-BC98-3FA7A44E2F36  0x0000000100ac2ea4 linkResources + 328
19  com.apple.CoreFoundation        0x0000000180365254 __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 20
20  com.apple.CoreFoundation        0x00000001803644ec __CFRunLoopDoBlocks + 404
21  com.apple.CoreFoundation        0x000000018035eda8 __CFRunLoopRun + 780
22  com.apple.CoreFoundation        0x000000018035e58c CFRunLoopRunSpecific + 572
23  com.apple.GraphicsServices      0x000000018b9c2740 GSEventRunModal + 160
24  com.apple.UIKitCore             0x00000001843ccbf0 -[UIApplication _run] + 964
25  com.apple.UIKitCore             0x00000001843d19d0 UIApplicationMain + 112
26  com.apple.dt.playground.stub.iOS_Simulator.scratch-playground-10BCB7AC-7E28-4D75-BC98-3FA7A44E2F36  0x0000000100ac2f7c main + 216
27  libdyld.dylib                   0x0000000180223cbc start + 4

我认为问题在于有两个核心位置二进制文件在起作用:

0x18321e000 -        0x1832a8fff  com.apple.corelocation (2420.12.16 - 2420.12.16) <F94D1F57-86D5-3A82-8F2B-80A9AEAC0308> /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/CoreLocation.framework/CoreLocation

0x1b1f96000 -        0x1b1f98fff +libswiftCoreLocation.dylib (5) <EE615605-C11D-3F60-B611-8B1C1D45FEEA> /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/swift/libswiftCoreLocation.dylib

操场正在从一个世界到另一个世界进行交流;与 iOS 模拟器交谈。但是两者之间存在不兼容,因为由于类型混淆,消息没有正确传递。这导致

*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“+ [NSValue valueWithMKCoordinate:]:无法识别的选择器发送到类 0x1c9d3f588”以未捕获的 NSException 类型异常终止

我认为您应该向 Apple 提交错误。为避免此问题,请直接基于 iOS 模拟器编写代码,而不是使用 Playground。在这种情况下,您的代码将正确执行(因为它将直接针对模拟器运行,而无需来自 Playground 的干预桥)。


推荐阅读