Objective-C自动释放池

Pio*_*otr 0 iphone memory-management objective-c

我正在与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];
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Mac*_*ade 10

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

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

这称为便捷方法,返回自动释放的对象.

因此,如果你不调用alloc,或者保留,你基本上不拥有这些对象,所以你不应该关心释放它们,就像别人会做的那样......

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

例如:

NSArray * myArray = [ NSArray emptyArray ];
Run Code Online (Sandbox Code Playgroud)

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

NSArray * myArray = [ [ NSArray emptyArray ] retain ];
Run Code Online (Sandbox Code Playgroud)

您保留它时必须释放阵列.

NSArray * myArray = [ [ NSArray alloc ] initWithArray: someArray ];
Run Code Online (Sandbox Code Playgroud)

同样在这里,您明确分配了数组.

NSArray * myArray = [ [ [ NSArray alloc ] initWithArray: someArray ] autorelease ];
Run Code Online (Sandbox Code Playgroud)

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

  • 所有内容都在[内存管理编程指南](http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmObjectOwnership.html)中进行了解释. (2认同)