将参数传递给方法:是否应该保留参数?

时间:2012-11-02 16:45:17

标签: objective-c ios xcode memory-management

如果我有这样的自定义方法:

- (void)myMethod:(id)myArgument 
{
      //do something with myArgument
}

如果我没有取得它的所有权,那么myArgument保证会坚持执行该方法吗?

修改 让我进一步阐述。说我在某处打电话:

[self myMethod:_myIvar];

然后在其他地方,当myMethod正在执行时,有人称之为:

[_myIvar release];

这会影响myMethod中的参数吗?

结束编辑

查看文档/示例代码,我很少在自定义方法的顶部看到[myArgument retain]或[myArgument copy]。那是不必要的?

谢谢!

3 个答案:

答案 0 :(得分:1)

如果myArgumentmyMethod开头的有效对象,并且您没有做任何事情导致在该方法中取消分配或以其他方式收集,那么是的,myArgument仍将是方法末尾的有效对象。

编辑以回答问题的编辑:在这种情况下,让我们谈谈对象所有权。当您将myArgument作为参数传递给函数时,您 - 在myMethod的上下文中 - 不要通过retain或{{1}来声明对该对象的兴趣它。在这种情况下,对象的唯一所有者存在于copy之外。

如果myMethod的最后一位所有者决定使用myArgumentmyArgument来完成它,那么release完全有可能消失 - 没有强引用对物体的任何更多,将保持它周围。 可能有效,取决于线程问题,涉及的自动释放池以及许多其他问题,但这是一个危险的游戏。如果甚至有可能发生这种情况,您应该按照Memory Management Policy的建议,在myArgument内明确声明对myArgument的兴趣。

答案 1 :(得分:0)

如果甚至可能另一个线程可能导致myArgument引用的对象被释放,那么myArgument可以随时成为垃圾内存的指针,然后你就会崩溃。

这与不在 -myMethod 中保留它无关。在retain方法调用期间,您可能会崩溃。相反,你的应用程序中有一个破碎的,不可行的线程模型/架构,你必须修复它。

这就是线程很难的原因。

答案 2 :(得分:-1)

不,不保证。您应该对要保留的任何内容发送retain,并在完成后release。否则另一个线程并在此期间解除它。

在为游戏编写A *算法时,我有点咬我。