1, 關聯對象的ObjectAssociation中有兩個屬性(uintptr_t _policy, id value),
_policy 包含 retain, assgin copy, 會對應的對對象進行和普通對象一樣的內存管理操作.
2 ,實現weak,用__weak修飾對象,並將其用block包裹,關聯時,關聯block對象
-(void)setWeakvalue:(NSObject *)weakvalue { __weak typeof(weakvalue) weakObj = weakvalue; typeof(weakvalue) (^block)() = ^(){ return weakObj; }; objc_setAssociatedObject(self, weakValueKey, block, OBJC_ASSOCIATION_COPY_NONATOMIC); } -(NSObject *)weakvalue { id (^block)() = objc_getAssociatedObject(self, weakValueKey); return block(); }
3.額外創造一個類WeakObjectContainer,在這個類里實現weak屬性 weakObject ,雖然 分類里 retain 了一個 WeakObjectContainer,但是 WeakObjectContainer 最終會隨着屬性的持有對象一起銷毀,不存在泄露。
WeakObjectContainer.h
@property (nonatomic, readonly, weak) id weakObject; - (instancetype)initWithWeakObject:(id)object;
WeakObjectContainer.m
- (instancetype)initWithWeakObject:(id)object { self = [super init]; if (self) { _weakObject = object; } return self; }
NSObject+AssociateWeak.h
@property(weak, nonatomic) NSObject *weakObject;
NSObject+AssociateWeak.m
首先導入頭文件
#import <objc/runtime.h> #import "WeakObjectContainer.h"
NSString const *kKeyWeakObject = @"kKeyWeakObject"; -(void)setWeakObject:(NSObject *)weakObject { WeakObjectContainer *container = [[WeakObjectContainer alloc] initWithWeakObject:weakObject]; objc_setAssociatedObject(self, &kKeyWeakObject, (id)container, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } -(NSObject *)weakObject { WeakObjectContainer *container = objc_getAssociatedObject(self, &kKeyWeakObject); return container.weakObject; }