ARC对象删除似乎在Swift Playground中不一致。这是一个错误还是设计?
考虑这个课程:
class Test {
var name: String
init(name:String){
self.name = name
println("\(name) initialized")
}
deinit{
println("\(name) deinitialized")
}
}
当我从操场上调用它时(不是命令行REPL,请参阅下面的注释):
var t1 = Test(name: "t1")
var t2 : Test? = Test(name: "t2")
t2 = nil
我只在控制台中看到初始化消息:
t1 initialized
t2 initialized
缺少的是t2的遗漏。
当我在app中运行它(例如app delegate的条目)时,输出与ARC删除一致(即t1 init,然后t2,t2 deinit然后是t1,因为整个调用块超出范围):
t1 initialized
t2 initialized
t2 deinitialized
t1 deinitialized
最后,在命令行REPL中(请参阅下面的注释以访问REPL),结果是明确的,即:t1由于其顶级范围而处于活动状态,但是t2被删除,正如人们所期望的那样。
1> class Test {
2. var name: String
3. init(name:String){
4. self.name = name
5. println("\(name) initialized")
6. }
7. deinit{
8. println("\(name) deinitialized")
9. }
10. }
11> var t1 = Test(name: "t1")
t1 initialized
t1 initialized
t1 deinitialized
t1: Test = {
name = "t1"
}
12> var t2 : Test? = Test(name: "t2")
t2 initialized
t2 initialized
t2 deinitialized
t2: Test? = (name = "t2")
13> t2 = nil
t2 deinitialized
14> t1
$R2: Test = {
name = "t1"
}
15> t2
$R3: Test? = nil
答案 0 :(得分:5)
我们在应用场景和Playground中比较了ARC /删除异议。我们的测试代码使用在特定范围内外创建的对象。我们还嵌套了测试对象以测试多嵌套作用域。
我们看到应用程序场景在cue上删除了对象(第0个引用),而Playground场景删除了一些,但保留了多数对象(无论范围如何,但显然是一致的)多次运行)。
Playground可能会保留对象以便为其辅助GUI输出(和/或其播放功能)提供服务。
请参阅博客文章here。
答案 1 :(得分:4)
我发现我可以通过添加一个可选的外层来触发操场中的deinit {}调用(Xcode版本6.0(6A313)):
struct MetaTest {
var t3: Test? = Test(name: "t3")
}
var mt3: MetaTest? = MetaTest()
mt3!.t3 = nil
创建此输出:
t3 initialized
t3 deinitialized