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