Objective-C自动释放池

时间:2011-03-26 11:28:44

标签: iphone objective-c memory-management

我正在与Daniel H Setinberg的“Cocoa Programming”开始我的Objective-C之旅。有一点让我对内存管理感到惊讶。实际上我发现Objective C中的内存管理比C更复杂,虽然我还没有触及“非垃圾收集语言”一段时间,所以使用malloc及其朋友的旧时代可能在我的记忆中理想化:)。

困扰我的一点是:

-(void) loadURLFromTextField{
  NSURL *url = [NSURL URLWithString:self.address.text];
  NSURLRequest *request = [NSURLRequest requestWithUrl:url];
  [self.webView loadRequest:request];
}

在第二行和第三行我分配了两个对象所以我假设我需要在某处释放它们。然而,对这段代码的评论指出:

  

“请注意,我们正在使用类方法   构建自动释放的实例   请求和URL。我们不需要   自己释放它们。“

有人可以帮助我理解为什么这些实例是自动释放的,以及如何从SDK文档中获取此实例。返回对象实例的所有类方法实际上都是自动释放的标准吗?感谢您的帮助!

2 个答案:

答案 0 :(得分:10)

你不必释放它们,因为你没有“拥有”它们(你没有明确地分配它们,也没有保留它们。)

自动释放的对象放置在NSAutoreleasePool类的当前实例上,它将在下次池耗尽时自动向它们发送释放消息,因此通常在当前运行循环结束时。

这就是所谓的便捷方法,它返回自动释放的对象。

所以如果你不调用alloc或者keep,你基本上不拥有这些对象,所以你不应该像其他人那样关心释放它们......

如果你释放它们,你可能会有一个段错误,因为释放两次物体可能会导致双重释放......

例如:

NSArray * myArray = [ NSArray emptyArray ];

自动释放对象,方便方法。你不拥有它,所以你不必释放它。

NSArray * myArray = [ [ NSArray emptyArray ] retain ];

您必须在保留数组时释放该数组。

NSArray * myArray = [ [ NSArray alloc ] initWithArray: someArray ];

同样在这里,因为你明确地分配了数组。

NSArray * myArray = [ [ [ NSArray alloc ] initWithArray: someArray ] autorelease ];

无需在此处发布,因为该对象已放置在自动释放池中,并将自动收到释放消息。

答案 1 :(得分:3)

在objective-c内存分配是关于所有权。原则上,包含单词new,alloc,copy或mutableCopy的方法被假定为返回您拥有的对象,因此必须释放,所有其他方法返回您不需要释放的自动释放对象,但是可以通过执行操作来接管所有权。保留

您可以阅读更多here