我们是否在快速枚举中发布参数?因此,此代码是否准确:
for (MKCircle *circle in localOverlays) {
[mapView addOverlay: circle];
[circle release]; // Is it perfectly alright to call this?
}
我只是想知道,我第一次使用快速枚举!
我们是否在快速枚举中发布参数?因此,此代码是否准确:
for (MKCircle *circle in localOverlays) {
[mapView addOverlay: circle];
[circle release]; // Is it perfectly alright to call this?
}
我只是想知道,我第一次使用快速枚举!
答案在Apple 内存管理规则中。
您拥有您创建的任何对象
您使用名称以“alloc”、“new”、“copy”或“mutableCopy”开头的方法创建对象</p>
你创造了circle
吗?不。
您可以使用保留来获取对象的所有权
你留住了circle
吗?不。
因此,您不拥有该对象。
您不得放弃您不拥有的对象的所有权
既然您已确定自己不拥有circle
. 您问题中示例代码中的版本不应该存在。事实上,最有可能的是,它会在某个地方导致崩溃。
快速枚举通常不会创建新对象,它会遍历现有对象。这就是为什么它几乎从来都不是正确的做法:常规容器(NSArray
, NSSet
, NSDictionary
)的快速枚举在使它们可用于循环之前不会保留对象,因此释放它们将是一个错误。即使在一个dealloc
方法中你也不应该这样做:释放容器也会释放它的项目,所以你不应该单独释放它们。
不,我不认为这是正确的做法。它既不对实例做 aretain
也不做 arelease
for (MKCircle *circle in localOverlays) {
[mapView addOverlay: circle]; //retain here
}
addOverley:应该做一个retain to ,当mapView不需要它时circle
,它是mapView的责任release
简单的指南,你retain
它,release
当你完成使用它时