美文网首页
Catagory 模拟添加 Weak 属性

Catagory 模拟添加 Weak 属性

作者: 一滴矿泉水 | 来源:发表于2022-06-01 10:07 被阅读0次
1、关联对象模拟weak的实现,自动置空
  • NSObject+weak.h
#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface NSObject (weak)

@property(nonatomic,weak)id weakObjc;

@end

NS_ASSUME_NONNULL_END
  • NSObject+weak.m
#import "NSObject+weak.h"
#import <objc/runtime.h>

typedef void (^DeallocBlock)(void);

@interface NSObject (weak)

@property(nonatomic,copy)DeallocBlock block;

@end

@implementation NSObject (weak)

- (id)weakObjc {
    return objc_getAssociatedObject(self, @selector(weakObjc));
}

- (void)setWeakObjc:(id)weakObjc {
    //⚠️注意 此处是 把block赋值给了weakObjc 把block当中间变量。
    [weakObjc setBlock:^{ //B关联了A中的weakObjc。当B对象释放的时候就会通过A去找weakObjc。所以会触发A的dealloc
        objc_setAssociatedObject(self, @selector(weakObjc), nil, OBJC_ASSOCIATION_ASSIGN);
    }];
    objc_setAssociatedObject(self,  @selector(weakObjc), weakObjc,     OBJC_ASSOCIATION_ASSIGN);
}

- (DeallocBlock)block {
    return objc_getAssociatedObject(self, @selector(block));
}

- (void)setBlock:(DeallocBlock)block {
    objc_setAssociatedObject(self, @selector(block), block,     OBJC_ASSOCIATION_COPY_NONATOMIC);
}

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation" //未使用default
- (void)dealloc {
    self.block?self.block():nil;  //weakObjc置空
    objc_setAssociatedObject(self, @selector(block), nil,OBJC_ASSOCIATION_COPY_NONATOMIC);//block置空
}
#pragma clang diagnostic pop

@end
  • 测试使用

     NSObject *obj1 = [NSObject new];
     NSObject *obj2 = [NSObject new];
     obj1.weakObjc = obj2;
     NSLog(@"Feng %@",obj1.weakObjc);
     obj2 = nil; //obj2持有obj1中的weakObjc。obj2为nil会调用obj2的dealloc,会通过obj1去找weakObjc,触发obj1的dealloc
     NSLog(@"Feng %@",obj1.weakObjc);
    
  • 输出结果

     2022-06-01 08:29:39.132352+0800 Demo[2495:44993] Feng <NSObject: 0x600001ac1680>
     2022-06-01 08:29:39.132563+0800 Demo[2495:44993] Feng (null)
    

参考连接:https://www.jianshu.com/p/df5bd59f14c1

文章持续更新中、希望对各位有所帮助、有问题可留言 大家共同学习.

相关文章

  • Catagory 模拟添加 Weak 属性

    1、关联对象模拟weak的实现,自动置空 NSObject+weak.h NSObject+weak.m 测试使用...

  • iOS类别Catagory添加weak属性

    开发过程中发现,一个控制器pop后不会走dealloc方法,除了一些常见的原因,还有个不容易被发现的问题 —— 该...

  • 分类添加weak属性

    1、增加中间变量 NSObject+weak2.h NSObject+weak2.m 测试使用 2、关联策略使用A...

  • Runtime

    概述 runtime 是什么 isa指针 runtime 怎么添加属性,方法等 runtime 如何实现weak属...

  • Category添加属性与__weak理解

    我们知道在一个类中用@property声明属性,编译器会自动帮我们生成成员变量和setter/getter,但分类...

  • 类别(Category)添加weak (property)属性,

    Category 在平常代码中经常使用,在使用第三方工具时,遇到工具不能直接解决当前问题的情况,我就会使用到Cat...

  • iOS 属性关键字

    概述 当我们用@property声明一个属性时,要给属性添加一些修饰符,如:retain、copy、weak、st...

  • Swift 代理方法

    设置代理: 添加代理属性 PS :看到有些博客些的是前面不带weak, 参考了 Swift - 委托(delega...

  • 一种objc的runtime的弱引用实现方式

    问题:如何动态的给oc对象添加weak属性的变量? 现状: objc的runtime仅支持assign,stron...

  • runtime 如何实现 weak 属性

    要实现 weak 属性,首先要搞清楚 weak 属性的特点: weak 此特质表明该属性定义了一种“非拥有关系” ...

网友评论

      本文标题:Catagory 模拟添加 Weak 属性

      本文链接:https://www.haomeiwen.com/subject/idnzprtx.html