我一直在寻找,我无法弄清楚他们是如何实现的?编译器必须做什么来判断何时应该释放一个对象?我不是在寻找一个非常详细的响应 - 虽然它会很好 - 但即使只是基本的运行,编译器需要弄清楚什么时候释放内存会很棒。
答案 0 :(得分:0)
ARC通过分析您的代码来确定每个对象的理想生命周期应该是多少,然后自动插入必要的保留和释放调用。该算法需要完全控制整个程序中的对象所有权,这意味着您不能手动调用保留,释放或自动释放。
您在ARC程序中找到的唯一与内存相关的方法是alloc和copy。您可以将这些视为普通的旧构造函数,并忽略整个对象所有权事物。
请参阅此链接 - http://rypress.com/tutorials/objective-c/memory-management
答案 1 :(得分:0)
编译器永远不会告诉对象它必须被释放。编译器通过引用告诉对象(更准确地说:运行时环境)对象不再拥有。运行时环境释放对象。当没有对象的所有权存在时(参考计数),这就完成了。
如果编译器生成存储对强引用变量的引用的代码,则编译器基本上表示所有权。 (它不仅是一个参考变量,而且是一个C对象。不要在这里关心它。)当参考不再存储在强引用变量中时,它放弃所有权。它有两种情况:
新引用存储在强引用变量中。
引用变量失去了它的范围。 (它自行死亡。但由于引用变量是C对象,因此不需要引用计数.C不知道引用计数。)
这是基本机制。有更复杂的场景作为表达式中的返回值,其他操作数具有副作用,但它是基本机制。 (例如,引用计数的主题不是引用变量,而是引用本身,如果引用未存储在评估复杂表达式的引用变量中,则引用本身可能不同。但这对于基本理解并不重要。)