2011-03-26 73 views
0

我以Daniel H Setinberg的“Cocoa Programming”开始我的Objective-C旅程。有一点让我惊讶于内存管理。实际上,我发现目标C中的内存管理比C中的复杂,尽管我一段时间没有触及“非垃圾收集语言”,所以使用malloc及其朋友的旧时代可能在我的记忆中是理想化的:)。Objective-C自动释放池

这让我感到困惑的一点是:

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

我分配的两个对象,所以我认为我需要在一些地方释放他们。然而,对于该位的代码的注释内容指出:

“请注意,我们使用类方法 构建的 自动释放的情况下,请求和URL我们不需要 释放他们自己。”

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

+0

我没有足够的肯定,使其答案知道这一点,但总的来说,如果你没有执行'alloc',那么你就不需要担心'release'。相反,如果你“分配”了一些你要负责的东西。 – Gareth 2011-03-26 11:35:00

回答

11

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

自动发布的对象放置在NSAutoreleasePool类的当前实例上,这会在下一次排空池时自动发送释放消息,因此通常在当前运行循环结束时发送消息。

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

所以,如果你不叫页头,或保留,你基本上没有自己的对象,所以你不应该在乎释放他们,因为别人会做...

如果释放出来,在你可能有一个段错误,因为两次释放对象可能导致双自由...

例如:

NSArray * myArray = [ NSArray emptyArray ]; 

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

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

您必须按照保留的顺序释放数组。

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

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

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

没有必要在这里释放,因为该对象已被放置在自动释放池,并会自动收到一个释放消息。

+2

[内存管理编程指南](http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmObjectOwnership.html)中有所说明。 – Jilouc 2011-03-26 11:39:06

+0

感谢您的明确答案 - 没有分配或保留=>没有发布! – Piotr 2011-03-26 11:42:32

+0

Jilouc - 你的回答也很赞赏,虽然没有Macmade那么多......周末愉快! – Piotr 2011-03-26 11:43:32

3

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

你可以阅读更多here