1

我们是否在快速枚举中发布参数?因此,此代码是否准确:

    for (MKCircle *circle in localOverlays) {

    [mapView addOverlay: circle];

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

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

4

3 回答 3

6

答案在Apple 内存管理规则中。

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

    您使用名称以“alloc”、“new”、“copy”或“mutableCopy”开头的方法创建对象</p>

你创造了circle吗?不。

您可以使用保留来获取对象的所有权

你留住了circle吗?不。

因此,您不拥有该对象。

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

既然您已确定自己不拥有circle. 您问题中示例代码中的版本不应该存在。事实上,最有可能的是,它会在某个地方导致崩溃。

于 2012-06-06T09:52:34.563 回答
1

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

于 2012-06-06T09:25:55.103 回答
1

不,我不认为这是正确的做法。它既不对实例做 aretain也不做 arelease

for (MKCircle *circle in localOverlays) {

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

addOverley:应该做一个retain to ,当mapView不需要它时circle,它是mapView的责任release

简单的指南,你retain它,release当你完成使用它时

于 2012-06-06T09:31:29.977 回答