我有一个方法接收一个数组,然后将其存储在NSObject属性中。
- (void)updatePoints:(NSArray *)pointArrayPassed
{
pointArray = pointArrayPassed;
pointCount= pointArray.count;
}
以下代码有效,但显然保持pointArrayPassed的指针,所以当我可以它反映调用堆栈。但是,如果我使用pointArrayPassed的副本,则应用程序开始大量泄漏!
函数中是否有一种方法只传递值而不是指针?
答案 0 :(得分:2)
在不释放当前对象的情况下,您不能仅仅在iVar中保留副本。否则你丢失了可以发送release
消息的指针 - 这就是为什么它会在整个地方泄漏。
这是一个更好的替代品。
- (void)updatePoints:(NSArray *)pointArrayPassed
{
if (pointArray == pointArrayPassed) {
//the new array is the same as the current one. Do nothing
return;
}
[pointArray release];
pointArray = [pointArrayPassed copy];
pointCount = pointArray.count;
}
但这不是最优雅的做法。
更好的方法是将pointArray声明为具有copy
作为其内存管理语义的属性(这很明显,因为您有一个可变/不可变类集群)。并且有一个名为-pointCount
的单独方法,它在需要时返回计数。