gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:06:48 25 4
gpt4 key购买 nike

我的应用程序有一个通用基类。通用基类需要一个协议(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com