ios - 使用具有协议(protocol)继承的泛型类在归档应用程序时出现 Segmentation failure 11 错误

标签 ios swift generics inheritance segmentation-fault

我的应用程序有一个通用基类。通用基类需要一个协议(protocol)才能将消息发送回 Controller 。

一切工作正常,但当我尝试存档应用程序时,我收到段错误:11 编译器错误

我对 swift 很陌生,因为我来自 .net,所以可能是我错过了其他东西,但我还没有找到有关该问题的任何答案

这是我如何重现该问题的代码

class BaseClass{
    @objc func myFunction(){

    }
}

class ClassA<T : ProtocolA> : BaseClass{
    var delegate: T?

    override func myFunction(){
        super.myFunction()

        self.delegate?.funcA?()
    }
}

class ClassB : ClassA<ProtocolB>{
    override func myFunction() {
        super.myFunction()

        self.delegate?.funcB?()
    }
}

@objc protocol ProtocolA{
    @objc optional func funcA()
}

@objc protocol ProtocolB : ProtocolA{
    @objc optional func funcB()
}

据我所知,问题出在 ClassA 中的泛型类型 delegate 变量上,但是如果 super.myFunction() 调用是在 ClassB 中注释掉正确构建的代码

我注意到的另一件事是,如果我将优化级别从快速、整个模块优化设置为,那么我也可以成功存档

更新1

我进一步简化了代码,而且我还发现,如果我使用类而不是协议(protocol)作为泛型参数,编译器可以优化代码并按预期工作

更新2 这是编译器消息

0  swift                    0x0000000104ae7dba PrintStackTraceSignalHandler(void*) + 42
1  swift                    0x0000000104ae71f6 SignalHandler(int) + 662
2  libsystem_platform.dylib 0x00007fff7b8a8f5a _sigtramp + 26
3  libsystem_platform.dylib 0x00007ffeee8182e8 _sigtramp + 1928786856
4  swift                    0x00000001014b4ca8 swift::irgen::CallEmission::emitToExplosion(swift::irgen::Explosion&) + 456
5  swift                    0x0000000101613aca (anonymous namespace)::IRGenSILFunction::visitFullApplySite(swift::FullApplySite) + 3290
6  swift                    0x00000001015f2a80 swift::irgen::IRGenModule::emitSILFunction(swift::SILFunction*) + 9152
7  swift                    0x00000001014fd4be swift::irgen::IRGenerator::emitGlobalTopLevel() + 1022
8  swift                    0x00000001015d28c5 swift::performIRGeneration(swift::IRGenOptions&, swift::ModuleDecl*, std::__1::unique_ptr<swift::SILModule, std::__1::default_delete<swift::SILModule> >, llvm::StringRef, llvm::LLVMContext&, llvm::GlobalVariable**) + 1589
9  swift                    0x000000010145b26a performCompile(swift::CompilerInstance&, swift::CompilerInvocation&, llvm::ArrayRef<char const*>, int&, swift::FrontendObserver*, swift::UnifiedStatsReporter*) + 17018
10 swift                    0x0000000101455784 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 7716
11 swift                    0x000000010140a6a8 main + 12248
12 libdyld.dylib            0x00007fff7b628145 start + 1
13 libdyld.dylib            0x0000000000000048 start + 2224914180

错误信息是:

1.  While emitting IR SIL function "@_T012BugReproduce6ClassBC10myFunctionyyF".
 for 'myFunction()' at /Users/pal.wagner/sources/playgrounds/BugReproduce/BugReproduce/Imps.swift:20:14

谢谢!

最佳答案

好吧,我终于成功了。

当我玩的时候,当我收到以下错误时,我从代码中删除了所有不必要的(至少对我来说)部分

Using 'ProtocolB' as a concrete type conforming to protocol 'ProtocolA' is not supported

这是代码

import Foundation

class BaseClass{
    @objc func myFunction(){

    }
}

class ClassA<T : ProtocolA> : BaseClass{
    var delegate: T?

    override func myFunction(){
        super.myFunction()

        self.delegate?.funcA()
    }
}

class ClassB: ClassA<ProtocolB>{

}

protocol ProtocolA{
    func funcA()
}

protocol ProtocolB : ProtocolA{
    func funcB()
}

所以问题似乎是基类没有泛型类型的类型?????? - WTH。

然后我尝试用以下方式声明该类,这是有效的:

导入基础

class BaseClass{
    @objc func myFunction(){

    }
}

class ClassA<T : ProtocolA> : BaseClass{
    var delegate: T?

    override func myFunction(){
        super.myFunction()

        self.delegate?.funcA?()
    }
}

class ClassB<T: ProtocolB>: ClassA<T>{
    override func myFunction() {
        super.myFunction()

        self.delegate?.funcB?()
    }
}

@objc protocol ProtocolA{
    @objc optional func funcA()
}

@objc protocol ProtocolB : ProtocolA{
    @objc optional func funcB()
}

所以答案是,在这种情况下你可以通过以下方式继承:

class ClassB<T: ProtocolB>: ClassA<T>

无论如何,当优化打开或只是抛出构建错误时,编译器可以给出更好的错误消息

关于ios - 使用具有协议(protocol)继承的泛型类在归档应用程序时出现 Segmentation failure 11 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46586528/

相关文章:

ios - 发送描述到 NSError

ios - 计算 UITableViewCell 的最佳图像大小

objective-c - 使用 block 参数从 Objective-C 调用 Swift 方法

java - Java中如何在子类中引用父类(super class)的泛型类型?

c# - 如何为采用泛型参数的泛型函数调用 GetMethod(不使用 GetMethods)?

ios - IBM Worklight/MobileFirst 6.x/7.0 - buildtime.sh 脚本出现 "Code object is not signed at all."错误

objective-c - 与 Facebook 集成

swift - 线程 1 : EXC_BAD_ACCESS (code=1, 地址=0x10) SwiftUI @main 应用程序

ios - 将 WKWebView 转换为 CIImage

c# - C# 如何在 C++ 不允许虚拟模板方法的情况下允许虚拟泛型方法?