2011-01-08 80 views
0

我有创建对象,其然后被传递到另一对象的方法在另一个线程,像这样的物体的方法,包括:自动释放物体

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

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

我的解决方案是在方法中手动释放对象。无论如何,我发现泄漏分析仪仍然认为这是泄漏,似乎不是Apple推荐的,因为所有者有责任释放该物体。

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

+0

哎呀,对不起,我忘了一个重要的元素:执行我报告的指令的线程不是可可线程。我使用POSIX线程创建它。 – 2011-01-08 10:30:59

+0

Cocoa线程和POSIX线程没有区别。但请确保您在线程的开头创建一个自动释放池。 – Yuji 2011-01-08 12:24:08

+0

我读过它也有必要创建至少一个NSThread以便能够使用NSAutoreleasePools。 – 2011-01-08 14:13:18

回答

9

我不完全理解你想达到什么样的,但一般:

你不应该担心谁以及何时释放/重新分配的对象。相反,只要在(你的单一对象或方法)开始需要它并释放它时停止需要它(或自动释放它,在这种情况下它将在线程上释放你称之为autorelease)。

这正是performSelectorOnMainThread:withObject:waitUntilDone:的工作方式。来自documentation

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

它保留它们,而它需要它们来完成它的工作。

总之,创建该对象,并把它们发送到另一个线程应该是mehod:

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确实“直到它被执行后”(该方法返回)。
  • 如果它稍后需要它,它应该被分配给一个保留它的属性。
0

你提的问题是很难理解,因为你谈论这个对象,该对象,另一个对象,并使用无意义的名称,像MyClass的anotherClass方法。目前还不清楚你打算发布哪一个对象,哪一个被报告为泄露对象。

无论如何,多线程不会为引用计数添加任何特殊的复杂性。当然,您的两个对象myClass其他类不是短命的对象。因此,如果您使用autorelease,请确保在执行完所有自动释放后参考计数器不会变为0。

这是完全没有问题的方法释放或者myClass的anotherClass或两者兼而有之。

你不会显示很多代码。但你显示的是好的。