foo*_*gry 7 objective-c objective-c-runtime objective-c-category
因为我们知道,我们可以添加使用类别和运行方法,如在Objective-C的变量
objc_setAssociatedObject和objc_getAssociatedObject.例如:
#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
Run Code Online (Sandbox Code Playgroud)
但有人知道做什么objc_getAssociatedObject或objc_setAssociatedObject做什么?我的意思是,我们添加到对象(这里self)的变量存储在哪里?和变量之间的关系self?
关联对象的代码 位于Objective-C运行时的objc-references.mm中.
如果我理解正确的话,有一个全局哈希映射(static AssociationsHashMap *_mapin class AssociationsManager)将对象的地址("伪装成" uintptr_t)映射到ObjectAssociationMap.
ObjectAssociationMap 存储一个特定对象的所有关联,并在以下时创建
void objc_setAssociatedObject(id object, void *key, id value, objc_AssociationPolicy policy)
Run Code Online (Sandbox Code Playgroud)
被称为对象的第一次.
ObjectAssociationMap是一个哈希映射,映射key到value和policy.
取消分配对象时,_object_remove_assocations()删除所有关联并在必要时释放值.
| 归档时间: |
|
| 查看次数: |
1654 次 |
| 最近记录: |