我们在快速枚举中释放一个参数吗?因此,这段代码是准确的:
for (MKCircle *circle in localOverlays) {
[mapView addOverlay: circle];
[circle release]; // Is it perfectly alright to call this?
}
我只是想知道,我第一次使用快速枚举!
答案 0 :(得分:6)
答案在Apple Memory Management Rules。
您拥有自己创建的任何对象
使用名称以“alloc”,“new”,“copy”或“mutableCopy”开头的方法创建对象
您创建了circle
吗?否。
您可以使用retain
获取对象的所有权
您保留circle
了吗?否。
所以你不拥有这个对象。
您不得放弃您不拥有的对象的所有权
由于您确定自己不拥有circle
,这似乎相当直接。您问题中的示例代码中的版本不应该存在。事实上,最有可能的是,它会在某个地方造成崩溃。
答案 1 :(得分:1)
快速枚举通常创建新对象,它通过现有对象。这就是为什么它几乎永远不是正确的事情:常规容器的快速枚举(NSArray
,NSSet
,NSDictionary
)在使它们可用于循环之前不保留对象,所以释放它们将是一个错误。即使在dealloc
方法中你也不应该这样做:释放容器也会释放它的项目,因此你不应该单独释放它们。
答案 2 :(得分:1)
没有。我不认为这是正确的做法。它既没有retain
也没有release
到实例
for (MKCircle *circle in localOverlays) {
[mapView addOverlay: circle]; //retain here
}
addOverley:应该保留circle
,当mapView不需要时,mapView负责release
简单指南,当您使用它时,retain
和release