我们是否在快速枚举中释放了一个参数

时间:2012-06-06 09:14:50

标签: objective-c loops fast-enumeration

我们在快速枚举中释放一个参数吗?因此,这段代码是准确的:

    for (MKCircle *circle in localOverlays) {

    [mapView addOverlay: circle];

    [circle release]; // Is it perfectly alright to call this?
}

我只是想知道,我第一次使用快速枚举!

3 个答案:

答案 0 :(得分:6)

答案在Apple Memory Management Rules

  
      
  • 您拥有自己创建的任何对象

         

    使用名称以“alloc”,“new”,“copy”或“mutableCopy”开头的方法创建对象

  •   

您创建了circle吗?否。

  

您可以使用retain

获取对象的所有权

您保留circle了吗?否。

所以你不拥有这个对象。

  

您不得放弃您不拥有的对象的所有权

由于您确定自己不拥有circle,这似乎相当直接。您问题中的示例代码中的版本不应该存在。事实上,最有可能的是,它会在某个地方造成崩溃。

答案 1 :(得分:1)

快速枚举通常创建新对象,它通过现有对象。这就是为什么它几乎永远不是正确的事情:常规容器的快速枚举(NSArrayNSSetNSDictionary)在使它们可用于循环之前不保留对象,所以释放它们将是一个错误。即使在dealloc方法中你也不应该这样做:释放容器也会释放它的项目,因此你不应该单独释放它们。

答案 2 :(得分:1)

没有。我不认为这是正确的做法。它既没有retain也没有release到实例

for (MKCircle *circle in localOverlays) {

    [mapView addOverlay: circle]; //retain here
}

addOverley:应该保留circle,当mapView不需要时,mapView负责release

简单指南,当您使用它时,retainrelease