繁体   English   中英

Objective-C自动释放池

[英]Objective-C autorelease pool

我从Daniel H Setinberg的“可可编程”开始我的Objective-C之旅。 内存管理使我有些惊讶。 实际上,我确实发现目标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或保留,则基本上不拥有对象,因此您不必像其他人那样去考虑释放它们...

如果释放它们,则可能会出现段错误,因为释放两次对象可能导致双重释放...

例如:

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的方法返回的是您拥有的对象,因此必须释放,所有其他方法都返回不需要释放的自动释放的对象,但是可以通过执行以下操作来接管所有权保留。

你可以在这里阅读更多

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM