Swift中的怪异记忆行为

Swift中的怪异记忆行为,swift,memory-management,Swift,Memory Management,好的。。。所以我不知道为什么会发生这种情况,但是: 比较以下两行: let pointCurve: [AnyObject] = self.curve.map{NSValue(point:$0)} 及 在这两种情况下,变量都是局部变量,赋值后根本不使用。该行驻留在一个被反复快速调用的方法中。第一种情况会导致内存使用量急剧增长。但是当我把它改为第二个时,内存统计数据就像一张光盘一样平坦 你可能会说,“哦,你没有在第二行做任何事情”。因此,我尝试了以下方法: var pointCurve: [Any

好的。。。所以我不知道为什么会发生这种情况,但是:

比较以下两行:

let pointCurve: [AnyObject] = self.curve.map{NSValue(point:$0)}

在这两种情况下,变量都是局部变量,赋值后根本不使用。该行驻留在一个被反复快速调用的方法中。第一种情况会导致内存使用量急剧增长。但是当我把它改为第二个时,内存统计数据就像一张光盘一样平坦

你可能会说,“哦,你没有在第二行做任何事情”。因此,我尝试了以下方法:

var pointCurve: [AnyObject] = []
for c in self.curve {
    pointCurve.append(NSValue(point:NSPoint(x:1, y:1))
}
vs

现在我看到了完全相同的结果。罪魁祸首似乎是价值观。我用仪器检查了一大堆的
NSConcreteValues
,我在网上读到了这些都与NSValue有关。但我没有发现任何关于它们导致内存泄漏的信息

问题是我能做些什么。我应该向一些ObjC代码发送一个点数组,在我找到解决方法之前,如果没有巨大的性能问题,我无法做到这一点。

试试:

func pointCurvy() {
    autoreleasepool {
        let pointCurve: [AnyObject] = self.curve.map{NSValue(point:$0)}            
        // Do something with pointCurve.
    }
}

为什么您认为
NSValue
s泄漏?它们被分配并存储在
pointCurve
数组中。你是说在
pointCurve
解除分配后它们仍然存在吗?@GregoryHigley嗯,内存会随着数组的大小而稳步增长。但它应该在每次通话结束时解除分配,不是吗?当我停止调用该方法时(它由鼠标移动事件触发,因此当我停止移动鼠标时),内存使用量停止增长。当我再次开始调用它时,使用情况会从上次停止的位置再次升级。当我不使用NSValue时,所有这些都不会发生,无论我是否调用该方法,内存都会保持稳定。请尝试在
autoreleasepool{}
中包装函数体。这。。。看起来效果不错。内存从每秒约0.3mb增加到每10秒约0.1mb。我仍然看到比不使用
NSValue
时更多的内存使用。这是一种用法,之后似乎没有减少。你能解释一下为什么事情会更好,为什么这在ARC Swift项目中是必要的吗?我只能猜测。我不确定Swift是如何实现数组的,但我怀疑类似于
[NSPoint]
的东西比
[NSValue]
更有效。后者可以通过引擎盖下的
NSArray
实现,但我强烈怀疑
[NSPoint]
是否有效。至于ARC问题,我只能再次推测。您看到的行为闻起来有对象被添加到自动释放池中,该池的排水口尚未清空。(可能是因为您在到达运行循环底部之前反复调用了函数。)至于发生这种情况的原因,我不知道。哦,您的
[NSPoint]
没有出现相同问题的原因是
NSPoint
没有添加到自动释放池中。谢谢!我了解到我必须阅读更多关于ObjC(/Swifts)ARC模型的内容。我会这么做的。
var pointCurve: [NSPoint] = []
for c in self.curve {
    pointCurve.append(NSPoint(x: 1, y: 1))
}
func pointCurvy() {
    autoreleasepool {
        let pointCurve: [AnyObject] = self.curve.map{NSValue(point:$0)}            
        // Do something with pointCurve.
    }
}