Combine.ObservableObject with CustomStringConvertible will crash/ Xcode11.2.1, under iOS13

Combine.ObservableObject with CustomStringConvertible will crash/ Xcode11.2.1, under iOS13



Hello there.



I make some feature with SwiftUI and Combine.ObservableObject.

It's OK with iOS13

but iOS12.1.4/iPhone6 always crashed with SIGABRT.

Thread 1 Queue : com.apple.main-thread (serial)
#0 0x0000000100a842e8 in __abort_with_payload ()
#1 0x0000000100a83928 in abort_with_payload_wrapper_internal ()
#2 0x0000000100a83958 in abort_with_payload ()
#3 0x0000000100a448f4 in dyld::halt(char const*) ()
#4 0x0000000100a44a10 in dyld::fastBindLazySymbol(ImageLoader**, unsigned long) ()
#5 0x00000001be080bd0 in dyld_stub_binder ()
#6 0x0000000100617d10 in type metadata accessor for Published ()
#7 0x00000001006182e8 in type metadata completion function for Model ()
#8 0x0000000100da5e64 in swift::MetadataCacheEntryBase<(anonymous namespace)::SingletonMetadataCacheEntry, int>::doInitialization(swift::ConcurrencyControl&, swift::MetadataCompletionQueueEntry*, swift::MetadataRequest) ()
#9 0x0000000100d9c580 in swift_getSingletonMetadata ()
#10 0x0000000100617e38 in type metadata accessor for Model ()
#11 0x0000000100db1cec in swift::TargetProtocolConformanceDescriptor::getCanonicalTypeMetadata() const ()
#12 0x0000000100db2d1c in swift_conformsToSwiftProtocolImpl(swift::TargetMetadata const*, swift::TargetProtocolDescriptor const*, llvm::StringRef) ()
#13 0x0000000100db2b78 in swift_conformsToProtocolImpl(swift::TargetMetadata const*, swift::TargetProtocolDescriptor const*) ()
#14 0x00000001006183f8 in swift::swift50override_conformsToProtocol(swift::TargetMetadata const*, swift::TargetProtocolDescriptor const*, swift::TargetWitnessTable const* (*)(swift::TargetMetadata const*, swift::TargetProtocolDescriptor const*)) ()
#15 0x0000000100d8c7fc in swift::_conformsToProtocol(swift::OpaqueValue const*, swift::TargetMetadata const*, swift::TargetProtocolDescriptorRef, swift::TargetWitnessTable const**) ()
#16 0x0000000100d902c0 in _conformsToProtocols(swift::OpaqueValue const*, swift::TargetMetadata const*, swift::TargetExistentialTypeMetadata const*, swift::TargetWitnessTable const**) ()
#17 0x0000000100d8f7f0 in _dynamicCastToExistential(swift::OpaqueValue*, swift::OpaqueValue*, swift::TargetMetadata const*, swift::TargetExistentialTypeMetadata const*, swift::DynamicCastFlags) ()
#18 0x0000000100b9ec4c in _print_unlocked<a, b="">(_:_:) ()
#19 0x0000000100610d1c in closure #1 in variable initialization expression of static A.a at /Users/gregory/Documents/LocalWorks/02.Topchul Examples/BugReport/SwiftCombineXcode12/SwiftCombineXcode12/AppDelegate.swift:18
#20 0x0000000100610ae8 in globalinit_33_83E805AAE6E55B0A6549C005E49F8EC8_func0 at /Users/gregory/Documents/LocalWorks/02.Topchul Examples/BugReport/SwiftCombineXcode12/SwiftCombineXcode12/AppDelegate.swift:12
#21 0x000000010093cdc8 in _dispatch_client_callout ()
#22 0x000000010093ee28 in _dispatch_once_callout ()
#23 0x0000000100db1afc in swift_once ()
#24 0x0000000100610e84 in A.a.unsafeMutableAddressor at /Users/gregory/Documents/LocalWorks/02.Topchul Examples/BugReport/SwiftCombineXcode12/SwiftCombineXcode12/AppDelegate.swift:12
#25 0x00000001006114ec in AppDelegate.application(_:didFinishLaunchingWithOptions:) at /Users/gregory/Documents/LocalWorks/02.Topchul Examples/BugReport/SwiftCombineXcode12/SwiftCombineXcode12/AppDelegate.swift:30
#26 0x0000000100612168 in @objc AppDelegate.application(_:didFinishLaunchingWithOptions:) ()
#27 0x00000001eb7cbca0 in -[UIApplication _handleDelegateCallbacksWithOptions:isSuspended:restoreState:] ()
#28 0x00000001eb7cd408 in -[UIApplication _callInitializationDelegatesForMainScene:transitionContext:] ()
#29 0x00000001eb7d2e54 in -[UIApplication _runWithMainScene:transitionContext:completion:] ()
#30 0x00000001eb06e93c in __111-[__UICanvasLifecycleMonitor_Compatability _scheduleFirstCommitForScene:transition:firstActivation:completion:]_block_invoke ()
#31 0x00000001eb0775bc in +[_UICanvas _enqueuePostSettingUpdateTransactionBlock:] ()
#32 0x00000001eb06e5b8 in -[__UICanvasLifecycleMonitor_Compatability _scheduleFirstCommitForScene:transition:firstActivation:completion:] ()
#33 0x00000001eb06ef58 in -[__UICanvasLifecycleMonitor_Compatability activateEventsOnly:withContext:completion:] ()
#34 0x00000001eb06d058 in __82-[_UIApplicationCanvas _transitionLifecycleStateWithTransitionContext:completion:]_block_invoke ()
#35 0x00000001eb06cd04 in -[_UIApplicationCanvas _transitionLifecycleStateWithTransitionContext:completion:] ()
#36 0x00000001eb071ec4 in __125-[_UICanvasLifecycleSettingsDiffAction performActionsForCanvas:withUpdatedScene:settingsDiff:fromSettings:transitionContext:]_block_invoke ()
#37 0x00000001eb072e24 in _performActionsWithDelayForTransitionContext ()
#38 0x00000001eb071d7c in -[_UICanvasLifecycleSettingsDiffAction performActionsForCanvas:withUpdatedScene:settingsDiff:fromSettings:transitionContext:] ()
#39 0x00000001eb076c68 in -[_UICanvas scene:didUpdateWithDiff:transitionContext:completion:] ()
#40 0x00000001eb7d134c in -[UIApplication workspace:didCreateScene:withTransitionContext:completion:] ()
#41 0x00000001eb3bc244 in -[UIApplicationSceneClientAgent scene:didInitializeWithEvent:completion:] ()
#42 0x00000001c106c9d4 in -[FBSSceneImpl _didCreateWithTransitionContext:completion:] ()
#43 0x00000001c107779c in __56-[FBSWorkspace client:handleCreateScene:withCompletion:]_block_invoke_2 ()
#44 0x00000001c1076e94 in __40-[FBSWorkspace _performDelegateCallOut:]_block_invoke ()
#45 0x000000010093cdc8 in _dispatch_client_callout ()
#46 0x0000000100940a10 in _dispatch_block_invoke_direct ()
#47 0x00000001c10aba9c in __FBSSERIALQUEUE_IS_CALLING_OUT_TO_A_BLOCK__ ()
#48 0x00000001c10ab728 in -[FBSSerialQueue _performNext] ()
#49 0x00000001c10abd44 in -[FBSSerialQueue _performNextFromRunLoopSource] ()
#50 0x00000001be5c60e0 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ ()
#51 0x00000001be5c6060 in __CFRunLoopDoSource0 ()
#52 0x00000001be5c5944 in __CFRunLoopDoSources0 ()
#53 0x00000001be5c0810 in __CFRunLoopRun ()
#54 0x00000001be5c00e0 in CFRunLoopRunSpecific ()
#55 0x00000001c0839584 in GSEventRunModal ()
#56 0x00000001eb7d4c00 in UIApplicationMain ()
#57 0x0000000100612884 in main at /Users/gregory/Documents/LocalWorks/02.Topchul Examples/BugReport/SwiftCombineXcode12/SwiftCombineXcode12/AppDelegate.swift:23
#58 0x00000001be07ebb4 in start ()


There is a Combine.ObservableObject class with CustomStringConvertible, like this

@available(iOS 13.0, *)
class Model: ObservableObject, CustomStringConvertible {
    @Published var value: Bool = true
    
    static let dummy = Model()
    
    var description: String {
        return "\(value)"
    }
}


There is a class with static properties that init with closure.(Alamofire) / like this

open class A {
    public static let a: String = {
        guard
            let info = Bundle(for: A.self).infoDictionary,
            let build = info["CFBundleShortVersionString"]
            else { return "Unknown" }
        
        return "\(build)" // <-- Crash: signal SIGABRT
    }()
}


if access class's static property, It will crash with some combine callstacks.


How can I avoid crash.?



Sincerely

Gregory J.H. Rho


ps.

I got first runtime-error. then I add "-weak_framework SwiftUI" to OtherLinkFlags.

After I encountered this issue.


You can download from https://www.dropbox.com/s/m2a20szkagpeiz9/SwiftCombineXcode12.zip?dl=0