自动释放在线程中创建的对象并在objective-C中传递给另一个对象

Luc*_*lon 0 cocoa-touch objective-c autorelease nsautoreleasepool ios4

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

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

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

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

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

Jak*_*čar 9

我不完全明白你想要实现的目标,但总的来说:

您不应该担心释放/取消分配对象的人员和时间.相反,只需确保在(的单个对象或方法)开始需要它时保留它并在停止需要它时释放它(或自动释放它,在这种情况下它将在您称为自动释放的线程上释放).

这正是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.
Run Code Online (Sandbox Code Playgroud)

要么

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];
Run Code Online (Sandbox Code Playgroud)

你现在的方式是内存泄漏.

接收方式:

  • 如果它仅在内部使用该对象,则不必保留它,因为performSelector"直到它执行后"(该方法返回).
  • 如果以后需要它,它应该被分配给保留它的属性.