美文网首页iOS -- runtime
iOS - runtime-03如何给分类添加属性

iOS - runtime-03如何给分类添加属性

作者: Coder_张三 | 来源:发表于2019-10-31 17:06 被阅读0次

在分类里面声明了一个属性相当于声明 setter / getter 方法,但是并没有存储实例变量。这个时候是不能用的,那如何在分类里添加属性的呢?
1.重写 setter 和 getter
2.通过 runtime,关联属性
代码很少,直接贴源码了。

//
//  Person+Attribute.h
//  01-RuntimeSendMessage
//
//  Created by Mac on 2019/10/31.
//  Copyright © 2019 Mac. All rights reserved.
//

#import "Person.h"

@interface Person (Attribute)

@property(nonatomic, copy) NSString *name;

@end

//
//  Person+Attribute.m
//  01-RuntimeSendMessage
//
//  Created by Mac on 2019/10/31.
//  Copyright © 2019 Mac. All rights reserved.
//

#import "Person+Attribute.h"
#import <objc/runtime.h>

@implementation Person (Attribute)
- (void)setName:(NSString *)name {
    objc_setAssociatedObject(self, "name", name, OBJC_ASSOCIATION_ASSIGN);
}

- (NSString *)name {
    return objc_getAssociatedObject(self, "name");
}
@end

通过objc_setAssociatedObject这个方法去设置。我们点开进去,看一下它的源码

/** 
 * Sets an associated value for a given object using a given key and association policy.
 * 
 * @param object The source object for the association.
 * @param key The key for the association.
 * @param value The value to associate with the key key for object. Pass nil to clear an existing association.
 * @param policy The policy for the association. For possible values, see “Associative Object Behaviors.”
 * 
 * @see objc_setAssociatedObject
 * @see objc_removeAssociatedObjects
 */
OBJC_EXPORT void
objc_setAssociatedObject(id _Nonnull object, const void * _Nonnull key,
                         id _Nullable value, objc_AssociationPolicy policy)
    OBJC_AVAILABLE(10.6, 3.1, 9.0, 1.0, 2.0);

第一个参数它让我们传一个对象,第二个参数传一个 key,第三个传一个 value,第四个直接传它给的就好了。
把值设置了之后我们需要获取的话就需要objc_getAssociatedObject这个方法,第一个参数也是一个对象,第二个参数是一个 value。它通过我们在 setName 方法设置时传的 key,去找相对应的 value,然后返回一个 value 给我们。
这个就是关联属性,通过它实现了在分类里添加属性。

相关文章

  • iOS - runtime-03如何给分类添加属性

    在分类里面声明了一个属性相当于声明 setter / getter 方法,但是并没有存储实例变量。这个时候是不能用...

  • 如何给iOS分类动态添加属性

    给分类扩展属性 创建Person 这个类 并且为Person这个类增加分类 为Person这个类扩充属性te...

  • Category 用runtime 关联对象

    如何给NSArray添加一个属性(不能使用继承)?不能用继承,难道用分类?但是分类只能添加方法不能添加属性啊(Ca...

  • iOS runtime 动态添加属性,方法,方法交换案例

    iOS runtime 动态添加属性,方法,方法交换案例 动态添加属性 我之前写过分类的文章,说过,分类不能添加成...

  • iOS Runtime之四:关联对象

    一、概述 如何给NSArray添加一个属性(不能使用继承)?不能用继承,难道用分类?但是分类只能添加方法不能添加属...

  • iOS 使用Runtime给Category添加属性

    一、概述 如何给NSArray添加一个属性(不能使用继承)?不能用继承,难道用分类?但是分类只能添加方法不能添加属...

  • IOS 分类中如何添加属性

    1.对于自己需要扩展的类创建一个分类 2.首先在.h文件中 相同于普通.h 加入 @property(retain...

  • Category-关联对象

    分类添加属性 Category能否添加成员变量?如果可以,如何给Category添加成员变量?不能直接给Categ...

  • ios分类添加属性

    为什么分类不能添加属性 结构体没有属性列表:这也就是为什么分类不能添加属性的本质原因。 属性是什么 生成实例变量 ...

  • ios分类添加属性

    一 定义一个类 Student.h文件 Student.m文件 二 定义分类 三 说明 四 注意事项

网友评论

    本文标题:iOS - runtime-03如何给分类添加属性

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