2017-09-13 128 views
0

说我要删除一个约束,传统上,我会做:设置`constraint.isActive = false`是否解除约束?

view.removeConstraint(constraint) 

然而,现在有用于安装/卸载限制新的isActive方法。

如果我做到以下几点:

constraint.isActive = false 

将它从内存中正确删除呢?

+0

为什么关注?当然,这个约束不再是* active *。但这听起来像你关心的是记忆?为什么? – dfd

+0

如果它实际上没有从内存中释放它,并且我不断地安装/删除约束,它会越来越消耗设备的内存。我们通常希望对象在不再使用时被释放。 – Senseful

+0

我认为你错了。约束是视图的一部分。您释放视图,释放约束。 (顺便说一下,为什么不使用ARC?)您不安装/删除*约束,您*激活/停用*它们。我认为这是对编码策略的一种调整,但是我们再一次不再在大型机具有64K核心内存的石器时代工作,我们正在谈论iOS/macOS设备(越来越多使用Swift和ARC代替Obj -C和手动内存分配和释放)使用数百GB的设备。 – dfd

回答

0

是,

constraint.isActive = false 

在做同样的事情:

viewThatOwnsConstraint.removeConstraint(constraint) 

因此,如果持有到约束的唯一的事情就是看,那么这将正确地从内存中删除。


这里的证明:

let view = UIView() 

weak var weakView: UIView? = nil 
autoreleasepool { 
    weakView = UIView() 
} 
assert(weakView == nil) 

// Traditional way of removing constraints ensures that the constraint is deallocated 

weak var weakConstraint: NSLayoutConstraint? = nil 
autoreleasepool { 
    weakConstraint = view.widthAnchor.constraint(equalToConstant: 10) 
} 
assert(weakConstraint == nil) // nothing is holding on to the constraint 

autoreleasepool { 
    weakConstraint = view.widthAnchor.constraint(equalToConstant: 10) 
    view.addConstraint(weakConstraint!) 
} 
assert(weakConstraint != nil) 

autoreleasepool { 
    view.removeConstraint(weakConstraint!) 
} 
assert(weakConstraint == nil) 

// New way of removing constraints: 

assert(weakConstraint == nil) 

autoreleasepool { 
    weakConstraint = view.widthAnchor.constraint(equalToConstant: 10) 
    weakConstraint!.isActive = true 
} 
assert(weakConstraint != nil) 

autoreleasepool { 
    weakConstraint!.isActive = false 
} 
assert(weakConstraint == nil) 
+0

并不意味着*所有*引用将删除问题中所述,只意味着视图不保留约束了,其他参考文献不受此行为的影响 –

+0

@MertBuran好点。我更新了问题标题以反映我真正想知道的内容。 – Senseful