美文网首页
关于Category关联属性

关于Category关联属性

作者: GY1994 | 来源:发表于2019-04-21 20:52 被阅读0次

关联属性的相关方法及优缺点

方法1 在分类中定义全局参数接收。

@implementation GYPerson (Extend)
int weight_;

- (void)setWeight:(int)weight {
    weight_ = weight;
}

- (int)weight {
    return weight_;
}
@end

GYPerson *person = [[GYPerson alloc] init];
person.weight = 20;
NSLog(@"%@", @(person.weight));

通过赋值打印,可以得出理想结果。但是,如果其他对象赋值,会重新覆盖值

    GYPerson *person = [[GYPerson alloc] init];
    person.weight = 20; //输出20
   
    GYPerson *person1 = [[GYPerson alloc] init];
    person1.weight = 50;
    NSLog(@"%@", @(person.weight)); // 输出50

所以该方法不可取

方法2使用字典存储值,保证每个对象的赋值都有唯一存储地址。


NSMutableDictionary *weightsMuDict;
+ (void)load {
    //保证只初始化一次
    weightsMuDict = [NSMutableDictionary dictionary];
}

- (void)setWeight:(int)weight {
    NSString *key = [NSString stringWithFormat:@"%p", self];
    weightsMuDict[key] = @(weight);
}

- (int)weight {
    NSString *key = [NSString stringWithFormat:@"%p", self];
    return [weightsMuDict[key] intValue];
}

@end

但是该方法可能存在线程安全的问题。

方法3使用Runtime中API方法关联对象

static const int weightKey;

- (void)setWeight:(int)weight {
    objc_setAssociatedObject(self, &weightKey, @(weight), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (int)weight {
    return [objc_getAssociatedObject(self, &weightKey) intValue];
}

//其他写法
- (void)setName:(NSString *)name {
    objc_setAssociatedObject(self, @selector(name), name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (NSString *)name {
    return objc_getAssociatedObject(self, @selector(name));
 //隐式参数 _cmd = @selector(name)
 //return objc_getAssociatedObject(self, _cmd);
}

Tip:
1.关联对象并不是存储在被关联对象本身内存中。
2.关联对象存储在一个全局的Associations Manager中
3.设置关联对象为nil,就相当于移除对象。

相关文章

  • 关于Category关联属性

    关联属性的相关方法及优缺点 方法1 在分类中定义全局参数接收。 通过赋值打印,可以得出理想结果。但是,如果其他对象...

  • 关联对象

    关联对象 关联对象一般用来配合 Category 使用,在 Category 中声明属性时编译器只会自动生成 Ge...

  • Category添加属性(关联)

    今天看HHRouter源码的时候看到这两句: 其中 objc_setAssociatedObject和objc_g...

  • Runtime #2

    Category关联属性 为一个对象设置关联对象,实现为其添加属性的效果,使用方法 Method Swizzlin...

  • Runtime之category关联属性

    类扩展时Apple又只提供了对方法的扩展,对属性的扩展是不会自动生成_变量以及属性的setter:和getter方...

  • 关于分类(Category)关联对象的一些了解

    本文是关于Category关联对象的一些理解化,以及部分使用建议。仅适用于新手玩家(对Category关联对象停留...

  • iOS内存管理-week和关联对象怎么释放(2)

    关联对象可以为category添加成员变量,因为我们虽然可以通过category为类添加属性,但是只是生成了方法声...

  • runtime的实际应用

    1、使用关联对象动态给分类添加属性 使用关联对象,可以为类添加Category中的属性,我们可以为现有类添加一些实...

  • 如何在关联对象上使用 weak

    要在 category 中定义属性, 唯一的办法就是使用关联对象. 但是关联对象的存储方式只有 assign, r...

  • 2018-05-17. Objective-C中给类别(Cate

    众所周知,类别(Category)是不能直接添加属性的,但是可以利用Runtime来关联对象添加属性。 首先,说一...

网友评论

      本文标题:关于Category关联属性

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