美文网首页
2-2 关联对象

2-2 关联对象

作者: Rumbles | 来源:发表于2019-03-22 10:02 被阅读0次

0.分类无法添加成员变量 但是可以添加属性。 但是同样也没有成员变量

1.将一个key 和一个对象关联起来

怎么给分类 添加属性呢?
虽然我们声明了属性方法 但是系统只会申明方法但是不会给我们实现get set方法 怎么办呢。我们自己实现一个
主要还是runtime的时候才会添加进类里面。所以才可以使用runtime方法来实现
但是类扩展是变异阶段就添加进去了。编译的时候系统会报错

#import "UITabBarController+Custom.h"
#import <objc/runtime.h>

///>  如何在.m里面添加属性
@interface UITabBarController (_ Custom)
////> 
@property (nonmatic, strong)  UIView *customTabbar;
@end
@implementation UITabBarController (_ Custom)
@end

@implementation UITabBarController (Custom)

- (void)setCustomTabbar:(UIView *)customTabbar {
    //这里使用方法的指针地址作为唯一的key
    objc_setAssociatedObject(self, @selector(customTabbar), customTabbar, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (UIView *)customTabbar {
    return objc_getAssociatedObject(self, @selector(customTabbar));
}

//其他方法...
1. static const char name;
  objc_setAssociatedObject(self, &name, customTabbar, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
2.static conat void *WJName;
  objc_setAssociatedObject(self, & WJName, customTabbar, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
3.  objc_setAssociatedObject(self, @"name", customTabbar, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

OC 中常量是保存在常量区。地址是不会变的
@end


实现的原理 保存在全局的HashMap当中 

 对象地址:Map. -->  @"name" :值

当我们对象销毁的时候 这个Map也会销毁

2.添加私有成员变量

给button添加block回调

@interface UIButton (Callback)

- (instancetype)initWithFrame:(CGRect)frame callback:(void (^)(UIButton *))callbackBlock;

@end

@interface UIButton ()

@property (nonatomic, copy) void (^callbackBlock)(UIButton * button);

@end

@implementation UIButton (Callback)

- (void (^)(UIButton *))callbackBlock {
    return objc_getAssociatedObject(self, @selector(callbackBlock));
}

- (void)setCallbackBlock:(void (^)(UIButton *))callbackBlock {
    objc_setAssociatedObject(self, @selector(callbackBlock), callbackBlock, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (instancetype)initWithFrame:(CGRect)frame callback:(void (^)(UIButton *))callbackBlock {
    
    if (self = [super initWithFrame:frame]) {
        self.callbackBlock = callbackBlock;
        [self addTarget:self action:@selector(didClickAction:) forControlEvents:UIControlEventTouchUpInside];
    }
    return self;
}

- (void)didClickAction:(UIButton *)button {
    self.callbackBlock(button);
}

@end

相关文章

  • 2-2 关联对象

    0.分类无法添加成员变量 但是可以添加属性。 但是同样也没有成员变量 1.将一个key 和一个对象关联起来 怎么给...

  • Swift 为分类增加属性objc_getAssociated

    OC 获取关联对象 Swift 获取关联对象——错误的写法 Swift 获取关联对象——正确的写法 设置关联对象 ...

  • iOS runtime关联对象 objc_setAssociat

    关联对象的作用: 关联对象可以给某个对象关联一个或者多个其他对象,这些对象通过健来区分。 创建存储关联对象objc...

  • 关联对象

    关联对象的方式 关联对象源码基本思路 关联对象的结构:AssociationsHashManager // Ass...

  • 关联对象

    关联对象原理 关联对象并不是存储在被关联对象本身内存中,关联对象存储在全局的统一的一个AssociationsMa...

  • iOS 关联对象

    概述 关联对象顾名思义,就是给对象关联对象的意思,一个对象可以关联多个其他对象,这些对象通过key来区分,存储对象...

  • 关联对象

    关联对象会用被关联对象作为key,将关联对象存储到全局的哈希表里。 AssociationHashMap Asso...

  • iOS关联对象技术原理

    iOS关联对象技术原理 iOS关联对象技术原理

  • 关联对象

    分类里面添加成员变量, 分类里面是不能直接添加成员变量的,但是可以通过runtime间接添加成员变量。 为什么...

  • 关联对象

    能否为分类添加 “成员变量” ? 为分类所添加的成员变量添加在哪里? 所有对象的关联内容都在同一个全局容器内关联对...

网友评论

      本文标题:2-2 关联对象

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