1

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

我想澄清几个例子:

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

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

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

4

1 回答 1

1

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

您的具体问题:

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

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

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

于 2013-02-02T12:49:10.373 回答