As we know, we can add a variable in Objective-C using a category and runtime methods like
objc_setAssociatedObject and objc_getAssociatedObject. For example:
#import <objc/runtime.h>
@interface Person (EmailAddress)
@property (nonatomic, readwrite, copy) NSString *emailAddress;
@end
@implementation Person (EmailAddress)
static char emailAddressKey;
- (NSString *)emailAddress {
return objc_getAssociatedObject(self,
&emailAddressKey);
}
- (void)setEmailAddress:(NSString *)emailAddress {
objc_setAssociatedObject(self,
&emailAddressKey,
emailAddress,
OBJC_ASSOCIATION_COPY);
}
@end
But does anybody know what does objc_getAssociatedObject or objc_setAssociatedObject do?
I mean, where are the variable we add to the object(here is self) stored? And the relationship between variable and self?
The code for associated objects is in objc-references.mm in the Objective-C runtime.
If I understand it correctly, there is one global hash map (static AssociationsHashMap *_map in class AssociationsManager) that maps the address of an object ("disguised" as uintptr_t) to an ObjectAssociationMap.
ObjectAssociationMap stores all associations for one particular object and is created
when
void objc_setAssociatedObject(id object, void *key, id value, objc_AssociationPolicy policy)
is called the first time for an object.
ObjectAssociationMap is a hash map that maps the key to value and policy.
When an object is deallocated, _object_remove_assocations() removes all associations
and releases the values if necessary.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With