ios - Swift 中的泛型和 EXC_BAD_ACCESS

标签 ios swift generics

我正在使用 Swift (XCode 6.3.1) 开发项目。在运行时我得到 EXC_BAD_ACCESS(我在模拟器 iPhone 6 上测试,但是当我使用单元测试类时,我也得到这个错误):

这显示了我的代码的结构:

// File IPerson.swift    
public protocol IPerson {
    var firstName : String? { get set }
    var secondName : String? { get set }    
}

// File PersonHelper.swift    
public class PersonHelper<T:IPerson> {
    public init(){
    }

    public func doSomething(person : T) -> Int {
        var secondName = person.secondName;
        //...
        return 0;
    }    
}

// File SamplePerson.swift    
public class SamplePerson: IPerson {
    public init() {
    }

    public var firstName : String?;
    public var secondName : String?;
}

// In some viewController (or in test class)
…
 var helper = PersonHelper<SamplePerson>();
 var person = SamplePerson();
 var result = helper.doSomething(person)
…

当我使用此版本的 IPerson 协议(protocol)时(更改了属性顺序!)一切正常。

// File IPerson.swift    
public protocol IPerson {
    var secondName : String? { get set }
    var firstName : String? { get set }    
}

这种行为对我来说很奇怪——协议(protocol)中属性的顺序很重要? 当我使用非泛型 PersonH​​elper 时一切正常,但我需要泛型类。 当我将所有协议(protocol)和类放在一个文件中时(从我执行 doSomething 方法 - viewController 或 testclass 开始)也一切正常。

我的代码有什么问题,或者这是 Swift 语言中的错误?

堆栈跟踪:

#0  0x00007f8d4840e350 in 0x7f8d4840e350 ()
#1  0x000000010449e253 in protocol witness for SampleProject.IPerson.firstName.materializeForSet : Swift.Optional<Swift.String> in conformance SampleProject.SamplePerson : SampleProject.IPerson in SampleProject at /Users/bjarko/Documents/XCode Projects/SampleProject/SampleProject/SamplePerson.swift:20
#2  0x000000010449e53e in SampleProject.PersonHelper.doSomething <A : SampleProject.IPerson>(SampleProject.PersonHelper<A>)(A) -> Swift.Int at /Users/bjarko/Documents/XCode Projects/SampleProject/SampleProject/Helper.swift:16
#3  0x0000000104499d35 in SampleProject.ViewController.viewDidLoad (SampleProject.ViewController)() -> () at /Users/bjarko/Documents/XCode Projects/SampleProject/SampleProject/ViewController.swift:18
#4  0x0000000104499dc2 in @objc SampleProject.ViewController.viewDidLoad (SampleProject.ViewController)() -> () ()
#5  0x0000000105058210 in -[UIViewController loadViewIfRequired] ()
#6  0x000000010505840e in -[UIViewController view] ()
#7  0x0000000104f732c9 in -[UIWindow addRootViewControllerViewIfPossible] ()
#8  0x0000000104f7368f in -[UIWindow _setHidden:forced:] ()
#9  0x0000000104f7fe21 in -[UIWindow makeKeyAndVisible] ()
#10 0x0000000104f23457 in -[UIApplication _callInitializationDelegatesForMainScene:transitionContext:] ()
#11 0x0000000104f261de in -[UIApplication _runWithMainScene:transitionContext:completion:] ()
#12 0x0000000104f250d5 in -[UIApplication workspaceDidEndTransaction:] ()
#13 0x0000000107d035e5 in __31-[FBSSerialQueue performAsync:]_block_invoke_2 ()
#14 0x00000001045bc41c in __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ ()
#15 0x00000001045b2165 in __CFRunLoopDoBlocks ()
#16 0x00000001045b1f25 in __CFRunLoopRun ()
#17 0x00000001045b1366 in CFRunLoopRunSpecific ()
#18 0x0000000104f24b42 in -[UIApplication _run] ()
#19 0x0000000104f27900 in UIApplicationMain ()
#20 0x000000010449d777 in main at /Users/bjarko/Documents/XCode Projects/SampleProject/SampleProject/AppDelegate.swift:12
#21 0x000000010694b145 in start ()
#22 0x000000010694b145 in start ()

最佳答案

终于找到解决办法了!在项目设置中,应将Whole Module Optimization 设置为Yes(默认为No),这样就可以了。 我找到文章 https://developer.apple.com/swift/blog/?id=27关于优化,这提供了信息:

"(...) if Whole Module Optimization is enabled, all of the module is compiled together at the same time (...)"

这就是为什么我将所有内容放在一个文件中时没有出现问题的原因。

关于ios - Swift 中的泛型和 EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29999742/

相关文章:

ios - 无法使用 dequeueReusableCell(withIdentifier : for:) from a xib file

ios - 如何在 iOS 7 中超过 180 秒的后台运行 NSTimer?

ios - 如何将 JSON 解析为 [String : AnyObject] in Swift

generics - Scala 集合中的泛型类

ios - Swift LayoutSubviews 在每次用户交互时移动所有 subview

ios - 如何解决 facebook - IOS sdk 中的此错误 "Failed to send AppEvents"

ios - UITableView 滚动到底部时更新数据

ios - 圈内圈

Java 泛型和类型同义词

scala - 如何在 Scala 中使我的不可变二叉搜索树通用?