Until now, I've been doing this:
static const char nametag_key;
return objc_getAssociatedObject(self, (void *) &nametag_key);
Turns out there's a much easier and better way. That's because Apple's selector implementation uses a fixed address. That means you can declare a property, for example:
@property (nonatomic) NSString *nametag;
and then use that property's selector as the key:
return objc_getAssociatedObject(self, @selector(nametag));
It's way cleaner, requires no extra static variables, and according to Gwynne, "It's absolutely safe and rather cutely self-documenting in current runtimes -- and for the foreseeable near future, no question."
Could this eventually break? Gwynne tells me that Apple would probably have to implement a completely new ABI for that to happen.