1

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

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

如果我不拥有它,myArgument 是否保证会坚持执行该方法?

编辑 让我进一步详细说明。假设我在某处称其为:

[self myMethod:_myIvar];

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

[_myIvar release];

这会影响 myMethod 中的参数吗?

结束编辑

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

谢谢!

4

3 回答 3

1

如果myArgument在 的开头是一个有效对象myMethod,并且在方法期间您没有做任何事情导致它被释放或以其他方式收集,那么是的,myArgument在方法结束时仍然是一个有效对象。

编辑以回应问题的编辑:让我们谈谈在这种情况下的对象所有权。当你myArgument作为参数传递给你的函数时,你 - 在上下文中myMethod- 不要通过retaining 或copying 来声明对对象的兴趣。在这种情况下,对象的唯一所有者存在于外部myMethod

如果 的最后一个所有者myArgument决定它已经完成myArgumentreleases 它,那么它完全有可能myArgument消失 - 不再有对该对象的强引用可以保留它。它可能是有效的,具体取决于线程问题、涉及的自动释放池以及许多其他问题,但这是一个危险的游戏。如果甚至有可能发生这种情况,您应该按照Memory Management Policy的建议明确声明对myArgumentwithin的兴趣。myMethod

于 2012-11-02T16:53:01.557 回答
0

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

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

这就是为什么线程很难。

于 2012-11-02T17:13:45.043 回答
-1

不,不能保证。您应该在完成时调用retain您希望保留的任何内容release。否则另一个线程并同时释放它。

在为游戏编写 A* 算法时,我曾有过这样的经历。

于 2012-11-02T17:07:28.197 回答