It's possible to attach an object to an existing object as if there was a new property. This is called association and allows one to extend existing objects. It can be used to provide storage when adding a property via a class extension or otherwise add additional information to an existing object.
The associated object is automatically released by the runtime once the target object is deallocated.
#import <objc/runtime.h> // "Key" for association. Its value is never used and doesn't // matter. The only purpose of this global static variable is to // provide a guaranteed unique value at runtime: no two distinct // global variables can share the same address. static char key; id target = ...; id payload = ...; objc_setAssociateObject(target, &key, payload, OBJC_ASSOCIATION_RETAIN); // Other useful values are OBJC_ASSOCIATION_COPY // and OBJ_ASSOCIATION_ASSIGN id queryPayload = objc_getAssociatedObject(target, &key);