user4951
user4951

Reputation: 33120

Does an object has pointers to it's pointers?

In ARC, when an object is released, the pointer is set to nil.

How does the object tell all those points that it's about to be released?

Does this work for strong pointers or all types of pointers?

Upvotes: 0

Views: 67

Answers (2)

Tommy
Tommy

Reputation: 100632

Based on some quick reading of what ARC required be added to the Objective-C runtime, the weak reference itself is registered with the runtime. There are a bunch of calls for setting up a weak connection, tearing it down and reassigning it. The compiler acts to decide what sort of assignment to do, much as it also has a role in automatically retaining and releasing. Per the linked document:

The runtime tracks __weak objects which holds non-null values. It is undefined behavior to direct modify a __weak object which is being tracked by the runtime except through an objc_storeWeak, objc_destroyWeak, or objc_moveWeak call.

From that I'd conclude that the runtime maintains a collection of every weak pointer that currently points to a given object. When that object is deallocated it zeros out the pointers.

So there is a list, per object, that points to the relevant pointers to create a two-directional connection. How and where that's stored isn't explicit — it could be via the existing object association mechanisms, it could be a global dictionary, it could be just about anything.

Upvotes: 1

rmaddy
rmaddy

Reputation: 318854

In ARC (or MRC), a pointer is NOT set to nil when an object is released. In ARC, a weak object reference is set to nil when an object is deallocated, not when it is released. There is a big difference here.

Upvotes: 1

Related Questions