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

Objective c 将参数传递给方法:是否应保留参数?,objective-c,ios,xcode,memory-management,Objective C,Ios,Xcode,Memory Management,如果我有这样一个自定义方法: - (void)myMethod:(id)myArgument { //do something with myArgument } 如果我不拥有该方法的所有权,我的参数是否保证会继续执行该方法 编辑 让我进一步说明。比如说,我把这个叫做: [self myMethod:_myIvar]; 然后在其他地方,当myMethod执行时,有人调用: [_myIvar release]; 这会影响myMethod中的参数吗 结束编辑 通过查看文档/示例代

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

- (void)myMethod:(id)myArgument 
{
      //do something with myArgument
}
如果我不拥有该方法的所有权,我的参数是否保证会继续执行该方法

编辑 让我进一步说明。比如说,我把这个叫做:

[self myMethod:_myIvar];
然后在其他地方,当myMethod执行时,有人调用:

[_myIvar release];
这会影响myMethod中的参数吗

结束编辑

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

谢谢

如果myArgument在myMethod的开头是一个有效的对象,并且您没有采取任何措施使其在方法期间被解除分配或以其他方式收集,那么是的,myArgument在方法的结尾仍然是一个有效的对象

编辑回答问题的编辑:在本例中,让我们谈谈对象所有权。当您将myArgument作为参数传递给函数时,在myMethod的上下文中,您不会通过保留或复制对象来声明对该对象的兴趣。在这种情况下,对象的唯一所有者存在于myMethod之外


如果myArgument的最后一个所有者决定使用myArgument并将其释放,那么myArgument完全有可能消失——不再有对对象的强引用来保持它。这可能是有效的,这取决于线程问题、涉及的自动释放池以及一系列其他问题,但这是一个危险的游戏。如果甚至有可能发生这种情况,您应该在myMethod中明确声明对myArgument感兴趣,正如。

不,这是不保证的。完成后,您应该调用retain以保留任何您希望保留并释放的内容。否则,请选择另一个线程并同时解除锁定它


我在为游戏编写A*算法时遇到过这种情况。

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

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


这就是线程化很困难的原因。

假设我传入了一个ivar,并且假设在执行myMethod:函数的过程中,ivar在其他地方被释放。该参数仍然可以保留?@seandaziser您刚刚声明了Tim指定的完全相反的条件才能保留该参数。我在这里大发雷霆,并建议:不。