2012-01-14 92 views
12

我正在学ARC。现在关于调零弱指针。我很了解所有功能。 弱引用的语义和GC系统的弱引用一样,但是你知道,Objective-C没有使用GC(除了特殊情况),所以我不明白它是如何工作的。ARC的调零弱指针行为如何实现?

我有点复杂的人,所以我需要知道底层的实现主体接受使用的功能。但是,问题在于它很难找到描述归零弱指针的原理:(

IMO,使这项工作的唯一方法是在运行时跟踪并保持所有指向自身的指针,并将它们全部设置为nil当其引用计数变为0。但是,这看起来太沉重的和愚蠢的。我相信,在实际ARC实现中使用了很多更好的解决方案。

你能帮我找到文档?还是直接说明会更伟大!

回答

17

这里说明:

http://mikeash.com/pyblog/friday-qa-2010-07-16-zeroing-weak-references-in-objective-c.html

剧透:

它的工作原理几乎你是怎么想的。每个类都维护一组指向它的弱指针地址,当它调用dealloc时,它将它们都设置为零。

这似乎是愚蠢的,但它的速度快,因为没有“跟踪”参与,ARC只是插入代码的指针每个对象被分配到一个新的弱引用时添加到该组。

它实际上比参与垃圾收集在挂羊头卖狗肉,这主要涉及通过堆在后台线程涉水寻找指针和保持他们指着什么股票更有效。

+2

实际上,在ARC下,编译器发出代码来调用函数,比如'objc_storeWeak'和'objc_loadWeakRetain'。这些函数是一个记录的API:http://clang.llvm.org/docs/AutomaticReferenceCounting.html#runtime – 2012-01-14 04:44:09

+0

是的,这些函数是如何添加和删除存储在对象中的集合中的弱指针,如我所述当我说“ARC只是添加代码来添加一个指针,该对象被分配给一个新的弱引用时,该指针” – 2012-01-15 09:47:32

+0

你知道弱指针是否归零时,对象的引用计数下降为0,还是在去分配时?我现在用一个“分配”指针遇到了一个问题,在那里被引用的对象被重用,但仍然调用它的dealloc,因为它的引用计数降到了0之间。我想知道零点弱指针是否能解决这个问题。 – fishinear 2013-03-07 08:35:39