gpt4 book ai didi

memory-management - Swift 协议(protocol)对象的 ARC

转载 作者:行者123 更新时间:2023-11-30 10:22:02 25 4
gpt4 key购买 nike

ARC 正在取消初始化仍然具有事件引用的协议(protocol)对象,这是一个错误还是预期行为?解决方法是什么?

protocol SomeProtocol: class {
...
}

class SomeClass: SomeProtocol {
...
}

class ClassA {
var protocolObject: SomeProtocol!
...
}


class ClassB {
var x: SomeClass!

func f() {
self.x = SomeClass()
var objA = ClassA()
objA.protocolObject = self.x
}
}

在此示例中,当 objA 被取消初始化时,它会尝试取消初始化 objA.protocolObject,即使仍有一个事件引用作为 objB.x。这会导致运行时错误 EXC_BAD_ACCESS。但是,如果ClassA定义如下:

class ClassA {
var protocolObject: SomeClass
}

代码运行没有错误,并且protocolObject没有被取消初始化。有什么想法吗?

最佳答案

更新

这个错误似乎从 iOS8.0 开始就得到了解决。

<小时/>

我遇到了同样的问题,并且已将问题范围缩小到被定义为仅类协议(protocol)的协议(protocol)(即 protocol XXX: class)。

protocol FooProtocol {
var name: String { get }
}

// Note: Class-Only protocol
protocol BarProtocol: class {
var name: String { get }
}

class Foo: FooProtocol {
let name: String = "Foo"
deinit {
println("\(name) deinit")
}
}

class Bar: BarProtocol {
let name: String = "Bar"
deinit {
println("\(name) deinit")
}
}

class Container {
let foo: FooProtocol = Foo()
let bar: BarProtocol = Bar()
}

class ViewController: UIViewController {

let container = Container()

override func viewDidLoad() {
super.viewDidLoad()

// Prints 'Test: Foo'
test(container.foo)

// Prints 'Test: Bar', followed by 'Bar deinit'
// subsequent access to the `bar` variable results in a crash
test(container.bar)
}

func test(bar: BarProtocol) {
println("Test: \(bar.name)")
}

func test(foo: FooProtocol) {
println("Test: \(foo.name)")
}

}

当前的解决方法是放弃使用仅类协议(protocol)。我已向 Apple 提交了错误报告,rdar://18287447。

关于memory-management - Swift 协议(protocol)对象的 ARC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25716860/

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