Iphone 目的-C自动释放池

Iphone 目的-C自动释放池,iphone,objective-c,memory-management,Iphone,Objective C,Memory Management,我将以丹尼尔·塞因伯格的《可可编程》开始我的Objective-C之旅。在内存管理方面有一点让我感到惊讶。事实上,我确实发现Objective C中的内存管理比C中的更复杂,尽管我已经有一段时间没有接触过“非垃圾收集语言”,所以在我的记忆中使用malloc及其朋友的旧时代可能是理想化的:) 让我困惑的是: -(void) loadURLFromTextField{ NSURL *url = [NSURL URLWithString:self.address.text]; NSURLReq

我将以丹尼尔·塞因伯格的《可可编程》开始我的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文档中获取这些。这是一个标准,所有这样的类方法返回一个对象实例实际上是自动删除。提前谢谢你的帮助

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

自动释放的对象被放置在NSAutoreleasePool类的当前实例上,该类将在下次清空池时自动向它们发送释放消息,因此通常在当前运行循环的末尾

这叫做便利方法,它返回自动释放的对象

因此,如果您不调用alloc或retain,您基本上不拥有这些对象,因此您不应该像其他人那样关心释放它们

如果你释放它们,你可能会有一个segfault,因为释放两次一个对象可能会导致双重自由

例如:

NSArray * myArray = [ NSArray emptyArray ];
通过方便的方法自动释放对象。你不拥有它,所以你不必发布它

NSArray * myArray = [ [ NSArray emptyArray ] retain ];
您必须释放阵列,因为您保留了它

NSArray * myArray = [ [ NSArray alloc ] initWithArray: someArray ];
这里也一样,因为您显式分配了数组

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

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

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


你可以阅读更多的

我不知道这一点,但总的来说,如果你没有执行
alloc
,那么你就不必担心
版本的问题。相反,如果你
alloc
某件事是你的责任。所有内容都在中解释。感谢你的明确回答-不允许alloc或retain=>不允许发布!Jilouc-我也很感激你的回答,虽然没有Macmake的那么多。。。。有一个愉快的周末!确实如此,但这一点在我面前仍然遥遥领先:)