2011-09-03 87 views
7

我知道在iOS的内存管理是棘手的,像我这样的新手,但我希望在这里我不能在其他地方找到一个清晰的解释在这里stackoverflow。autorelease与释放dealloc

所以,假装我有一个属性/伊娃

@property(nonatomic, retain) UIPopoverController *popOver; 

这我分配是这样的:

self.popOver = [[[UIPopoverController alloc] initWithContentViewController:popOverContent] autorelease];  

现在,在我的dealloc和viewDidUnload方法,我做两个

// in viewDidUnload: 
self.popOver = nil; 
// in dealloc: 
[popOver release]; 

问题:

  1. 如果我在viewDidUnload/dealloc中执行nil/release,我真的需要在分配时自动释放吗?
  2. 反之亦然,如果我在分配autorelease,我需要零/释放后?
  3. 有什么区别?提前为你的时间

谢谢 - 我会继续读书,认真内存管理不能是硬来包装你的头周围...

+0

感谢您编辑标题;我看到类似的问题,前面有“iOS:”;实际上没有它开始。 – pille

回答

5

不要通过该行的自动释放混淆:

self.popOver = [[[UIPopoverController alloc] initWithContentViewController:popOverContent] autorelease]; 

该语句后您拥有有效的,因为属性setter声称它的所有权对象。自动释放余额为alloc-init

所以...是的,你需要在分配时自动释放。如果你这样做(没有自动释放),你会泄漏:

self.popOver = [[UIPopoverController alloc] initWithContentViewController:popOverContent]; 

另一种方法是使用一个临时变量,而不是autorelease:你需要释放对象dealloc

UIPopoverController *temp = [[UIPopoverController alloc] initWithContentViewController:popOverContent]; 
self.popOver = temp; 
[temp release]; 

无论哪种方式。

+0

感谢Abizern&Yuji以及他们非常有启发性的答案。我现在也明白Yuji的回答中描述的“地方所有权”的概念。无论如何,有什么办法来测试你的应用程序的内存泄漏(也许使用仪器)? – pille

+0

@pille是的,你可以使用[Instruments](http://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/Introduction/Introduction.html)。在Xcode中,[单击并按住运行按钮](http://stackoverflow.com/questions/5305906/xcode-4-running-the-leaks-instrument)或选择[Product - > Profile](http:// stackoverflow的.com /问题/ 5304390 /仪器合的xcode-4)。这会弹出一个对话框,您可以选择“泄漏”。 – albertamg

+0

@pille即使在使用仪器之前,只需执行“分析”,即在XCode的“构建”菜单下方可用。 – Yuji

4

1如果我做零/释放viewDidUnload/dealloc,我真的需要autorelease在分配?

是的。

2反之亦然,如果我在分配时进行autorelease,是否需要以后无/发布?

是的。

在第一种情况下,代表该方法完成自动释放。该方法不再需要popover,所以它需要(自动)释放它。

dealloc,您的对象不再需要popover。因此,你需要释放它。

这很简单。您不必考虑长期对象所有权;你只需要在每个方法的层面上进行本地思考。释放与否的决定完全取决于该对象是否由程序的其他部分保存。在一种方法中,如果你分配一个对象,并且你不再需要它,那么你(自动)释放它。

dealloc是规则的轻微例外。在那里,你需要释放所有实例变量的所有权。

就是这样!

1
  1. 是的。但在这种情况下可能不会。
  2. 是的。但在这种情况下可能不会。
  3. viewDidUnload在卸载视图时调用,当视图Controller被销毁时调用dealloc

viewDidUnload你释放了由观点那些不再需要,可以在viewDidLoad中重新使用的对象。很显然,由于未显示视图,因此无需保留视图控制器为其设置的对象。

dealloc您正在清理viewController并在这里清除所有资源,包括它已分配给视图的资源。

在这种情况下,视图不拥有popover控制器 - 它应该由视图控制器拥有,所以不需要在viewDidUnload中释放它,但是您需要在dealloc中释放它。

相关问题