【问题标题】:ARC and memory managementARC 和内存管理
【发布时间】:2013-01-17 16:29:19
【问题描述】:

我仍然不是 100% 了解 ARC 内部结构。

我想澄清几个例子:

在方法内部分配并返回的someObjectToReturn = [[SomeClass alloc] init]; 会发生什么情况?如果someObjectToReturn被分配给例如someObject,someObjectToReturn 什么时候释放?当 someObject 为 nilled 或 someObjectToReturn 是否仍需要添加到自动释放池中?

另一种情况是,如果一个对象数组被清零,是否所有的对象都被释放了?

最后,哪里是释放复制块对象的好地方?还是执行后块仍然会被释放?如果将复制的块添加到自动释放池中,什么时候会耗尽该池? 假设有 10 个块,每个块都添加到自动释放池中,过早将其耗尽会导致正在执行的块死亡。可以从自身内部对复制的块进行 nill,例如将块的 nill 分派回主线程吗?

【问题讨论】:

    标签: objective-c automatic-ref-counting


    【解决方案1】:

    你似乎把事情复杂化了。在 ARC 下,您无法释放对象,或耗尽自动释放池,因此没有“正确”的时间来执行此操作。不要考虑保留、释放和自动释放(除非在紧密循环中),要考虑对象所有权。

    您的具体问题:

    1. 当分配返回值的变量超出范围或设置为 nil 时,该对象将被释放。你不必担心。

    2. 是的,当数组设置为nil时,数组的所有内容都会被释放,你不用担心

    3. 您可以在完成后将保存复制块的值设置为 nil,否则当拥有复制块的对象消失时,它会消失。您不能在 ARC 下耗尽自动释放池,您可以将语句包装在 @autoreleasepool{} 块中,但这只会捕获块中的所有内容 - 您不会将内容“添加”到池中或“排出”池。

    【讨论】:

    • 谢谢。那么保留周期是 ARC 下需要注意的主要事情吗?另外,如何处理对象覆盖?如果一个 NSMutableArray *someArray 被设置为一个新的数组,应该先将其 nilled,还是会自动释放之前的对象?
    • 保留周期是主要问题,是的。你的第二个问题,ARC 再次为你做了所有这些。真的很好:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 2011-11-14
    • 2013-10-03
    • 2013-06-08
    • 1970-01-01
    • 2012-07-27
    相关资源
    最近更新 更多