關聯對象的如何進行內存管理的?關聯對象如何實現weak屬性


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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM