如果我有这样的自定义方法:
- (void)myMethod:(id)myArgument
{
//do something with myArgument
}
如果我没有取得它的所有权,那么myArgument保证会坚持执行该方法吗?
修改 让我进一步阐述。说我在某处打电话:
[self myMethod:_myIvar];
然后在其他地方,当myMethod正在执行时,有人称之为:
[_myIvar release];
这会影响myMethod中的参数吗?
结束编辑
查看文档/示例代码,我很少在自定义方法的顶部看到[myArgument retain]或[myArgument copy]。那是不必要的?
谢谢!
答案 0 :(得分:1)
如果myArgument
是myMethod
开头的有效对象,并且您没有做任何事情导致在该方法中取消分配或以其他方式收集,那么是的,myArgument
仍将是方法末尾的有效对象。
编辑以回答问题的编辑:在这种情况下,让我们谈谈对象所有权。当您将myArgument
作为参数传递给函数时,您 - 在myMethod
的上下文中 - 不要通过retain
或{{1}来声明对该对象的兴趣它。在这种情况下,对象的唯一所有者存在于copy
之外。
如果myMethod
的最后一位所有者决定使用myArgument
和myArgument
来完成它,那么release
完全有可能消失 - 没有强引用对物体的任何更多,将保持它周围。 可能有效,取决于线程问题,涉及的自动释放池以及许多其他问题,但这是一个危险的游戏。如果甚至有可能发生这种情况,您应该按照Memory Management Policy的建议,在myArgument
内明确声明对myArgument
的兴趣。
答案 1 :(得分:0)
如果甚至可能另一个线程可能导致myArgument引用的对象被释放,那么myArgument可以随时成为垃圾内存的指针,然后你就会崩溃。
这与不在 -myMethod 中保留它无关。在retain方法调用期间,您可能会崩溃。相反,你的应用程序中有一个破碎的,不可行的线程模型/架构,你必须修复它。
这就是线程很难的原因。
答案 2 :(得分:-1)
不,不保证。您应该对要保留的任何内容发送retain
,并在完成后release
。否则另一个线程并在此期间解除它。
在为游戏编写A *算法时,我有点咬我。