Come sappiamo, possiamo aggiungere una variabile in Objective-C usando una categoria e metodi di runtime come objc_setAssociatedObject
e objc_getAssociatedObject
. Per esempio:Come funziona objc_setAssociatedObject?
#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
Ma qualcuno sa quello che fa objc_getAssociatedObject
o objc_setAssociatedObject
fare? Voglio dire, dove sono memorizzate le variabili che aggiungiamo all'oggetto (qui è self
)? E la relazione tra variabile e self
?
Qualsiasi motivo per non utilizzare solo la proprietà? Vorrei provare a non scherzare con il runtime senza capire come funziona. –
[Ecco qui] (http://www.opensource.apple.com/source/objc4/objc4-532/runtime/objc-runtime.mm) la loro implementazione. –
@ H2CO3, il file con il codice effettivamente interessante è objc-references.mm: http://www.opensource.apple.com/source/objc4/objc4-532/runtime/objc-references.mm –