On the other hand, if the refCount is equal to the number of objects in the refList, that means that we know all of the objects which are retaining us. In this way, all related objects are checked to see whether they are retained by any object which is outside the group. Rather than freeing the object directly, it is added to a special pool of objects which will be freed upon return to the main run loop. This is necessary because there are situations in which other objects will send messages to the object after it has determined that it will free itself, as part of the joint release process. So it can't actually be freed until later.
Infinite recursion is a problem which had to be dealt with in a couple of situations.
In this way, no object is ever asked to respond to the same request twice. In some other cases, we set a flag in the object indicating that it is already checking whether it can be freed, or will be freed, or is being freed. In the simulator, this is represented by a notation on the refCount line. In a real implementation, a single recursion-prevention flag would suffice for all three cases. It should be noted that, so far, we have implemented this algorithm only in the HyperSense simulator, not in actual Objective C code.