0

我有一个对象的方法,它创建对象,然后将其传递给另一个线程中另一个对象的方法,如下所示:

MyClass* myClass = [[MyClass alloc] init];
[anotherClass performSelectorOnMainThread:@selector(method) withObject:myClass waitUntilDone:NO];

在方法中,我立即保留对象,假设它会被创建者以某种方式释放。我的问题是:如何让 MyClass 正确释放该对象?这是正确的方法吗?

我的解决方案是在方法中手动释放对象。无论如何,我看到泄漏分析器仍然将其识别为泄漏,并且似乎不是 Apple 推荐的,因为所有者有责任释放该对象。

你能解释一下处理这种情况的正确方法吗?谢谢!

4

2 回答 2

9

我不完全理解您要达到的目标,但总的来说:

您不必担心谁以及何时释放/解除分配对象。相反,只需确保在(您的单个对象或方法)开始需要它时保留它,并在停止需要它时释放它(或自动释放它,在这种情况下,它将在您调用 autorelease 的线程上释放)。

这正是工作的方式performSelectorOnMainThread:withObject:waitUntilDone:。从文档中:

此方法保留接收器和 arg 参数,直到执行选择器之后。

它在需要他们完成工作的同时保留他们。

简而言之,创建对象并将它们发送到另一个线程的方法应该是:

MyClass* myClass = [[MyClass alloc] init]; // retained, will need it for performSelector
[anotherClass performSelectorOnMainThread:@selector(method) withObject:myClass waitUntilDone:NO];
[myClass release]; // no longer needing it.

或者

MyClass* myClass = [[[MyClass alloc] init] autorelease]; // will be released automatically, but guaranteed to be retained until this method returns
[anotherClass performSelectorOnMainThread:@selector(method) withObject:myClass waitUntilDone:NO];

你现在拥有它的方式是内存泄漏

领取方式:

  • 如果它仅在内部使用该对象,则不必保留它,因为performSelector“直到它执行之后”(方法返回)。
  • 如果以后需要它,则应将其分配给保留它的属性。
于 2011-01-08T11:37:36.630 回答
0

您的问题很难理解,因为您谈论的是这个对象、那个对象、另一个对象,并且使用了无意义的名称,例如myClassanotherClassmethod。目前尚不清楚您打算释放哪个对象以及哪个对象被报告为泄漏。

无论如何,多线程不会给引用计数增加任何特殊的复杂性。当然,您的两个对象myClassanotherClass不是短期对象。因此,如果您使用自动释放,请确保如果所有自动释放都已执行,引用计数器不会变为 0。

在method中释放myClassanotherClass或两者都是完全可以的。

你没有显示很多代码。但是你显示的没问题。

于 2011-01-08T11:33:49.790 回答