2012-09-19 20 views
1

我的问题基本上是标题。在打开自动引用计数功能的XCode中,我是否需要手动管理内存?像调用发布,保留等?随着ARC将我需要手动管理内存?

谢谢!

+0

在ARC中,您不必担心释放内存。但请注意,在使用它时不会释放对象。 –

+0

@Prince:对象何时被释放? – Surfbutler

+0

@Surfbutler在未来的任意点。这将是确定性的,但不是从你的语法中明确的,除了你会隐含提供更高的生命周期边界。所以像Guard Malloc和僵尸这样的东西应该可靠地捕捉到问题并且性能应该是可预测的,但是编写假定发布将会发生的代码是一个坏主意 - 尽管由于各种原因它总是一个坏主意。如果您需要明确告诉某人什么时候停止某件事情,请按照'NSTimer'模式的'invalidate'类型步骤操作。 – Tommy

回答

5

ARC只处理Objective-C对象。所以你需要手动继续管理Core Foundation和普通的C内存。

虽然您不需要手动保留或释放,但您仍然负责防止保留周期 - 确保将适当的属性标记为强和弱。所以你需要继续考虑所有权方面的问题。

除此之外,至少有一个非常具体的怪癖 - 如果堆栈要在它们下面放松,则需要记住复制块。这是为了确保它们最终堆在栈上,而不是堆栈,因此与内存管理相关。

+0

在某些情况下(例如将块分配给属性或从函数返回一个块),块将自动复制,但我不会依赖它。 –

+0

我认为它们在被其他模块捕获时也被复制,因此它覆盖了99%的实际用例,但我还没有找到任何可引用的参考,例如,将一个作为对象传递给'performSelector:... afterDelay:'将是安全的。 – Tommy

+0

不,只是任意将一个块作为一个对象传递给另一个函数是不“安全的”,让我解释一下为什么:当块被传递到已经复制了对象(如属性)的函数中时,会自动复制块,但它们不是'保持像普通物体一样。所以,虽然我可能有一个强烈的引用块,除非这个块在堆上,这意味着什么。当分配给任意类型('id')时,块不会被复制,因为ARC不知道你想使用'copy'和'retain'(它只在块已经被复制时才起作用)。块很混乱。 –