美文网首页
ios分类添加属性

ios分类添加属性

作者: 小小志伟 | 来源:发表于2018-10-16 09:46 被阅读0次

为什么分类不能添加属性

Category
Category 是表示一个指向分类的结构体的指针,其定义如下:
typedef struct objc_category *Category;
struct objc_category {
  char *category_name                          OBJC2_UNAVAILABLE; // 分类名
  char *class_name                             OBJC2_UNAVAILABLE; // 分类所属的类名
  struct objc_method_list *instance_methods    OBJC2_UNAVAILABLE; // 实例方法列表
  struct objc_method_list *class_methods       OBJC2_UNAVAILABLE; // 类方法列表
  struct objc_protocol_list *protocols         OBJC2_UNAVAILABLE; // 分类所实现的协议列表
}

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

属性是什么

属性 = 成员变量 + set方法 + get方法。
@interface DKObject : NSObject

@property (nonatomic, strong) NSString *property;

@end
@implementation DKObject {
    NSString *_property;
}

- (NSString *)property {
    return _property;
}

- (void)setProperty:(NSString *)property {
    _property = property;
}

@end
  • 生成实例变量 _property
  • 生成 getter 方法 - property
  • 生成 setter 方法 - setProperty:

当我们声明一个属性str的时候,在编译阶段,编译器会自动给对象添加一个实例变量_str和它的存取方法- (void)setStr:(NSString *)str和- (NSString *)str。这个过程由于是在编译阶段自动合成的,所以我们在编辑阶段是看不到的。

怎么添加属性

由于OC是动态语言,可以通过runtime手动添加setter/getter方法。

#import <objc/runtime.h>

static NSString *nameWithSetterGetterKey = @"nameWithSetterGetterKey";   //定义一个key值
@implementation Programmer (Category)

//运行时实现setter方法
- (void)setNameWithSetterGetter:(NSString *)nameWithSetterGetter {
        objc_setAssociatedObject(self, &nameWithSetterGetterKey, nameWithSetterGetter, OBJC_ASSOCIATION_COPY);
}

//运行时实现getter方法
- (NSString *)nameWithSetterGetter {
    return objc_getAssociatedObject(self, &nameWithSetterGetterKey);
}

@end

关联对象associatedObject理解

  • objc_setAssociatedObject
void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy);

以键值对形式添加关联对象:

参数|含义|
-|-|-|
id|关联对象|
key|键值对key(必须要唯一,所以用static修饰)|
value|键值对vaule|
policy|修饰属性

  • objc_getAssociatedObject
id objc_getAssociatedObject(id object, const void *key);

根据 key 获取关联对象

引用

相关文章

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

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

  • ios分类添加属性

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

  • ios分类添加属性

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

  • iOS 分类添加属性

    给分类 Category 添加属性,首先要创建一个分类文件,然后添加你要的属性 .h 文件 @property (...

  • ios中的分类

    在ios中给分类添加属性,可以通过属性关联来实现重写set方法如下: -(NSMutableDictionary ...

  • 类 *分类* 类扩展

    分类:Category iOS中的分类主要的作用就是为类提供扩展,增加一些方法。但是只能添加方法 不能添加属性?我...

  • iOS 类别(分类)添加属性

    一:首先介绍Category好处: 1、可以将类的实现分散到多个不同文件或多个不同框架中,方便代码管理。也可以对框...

  • iOS 分类中添加属性

    很简单,看下注释就明白了。github代码

  • ios 分类中添加属性

    category使用 objc_setAssociatedObject/objc_getAssociatedObj...

  • iOS 分类中添加属性

    注意 分类主要是给原类添加方法的,分类的结构指针中只有方法列表,没有属性列表。所以原则上分类里面最好不要声明属性 ...

网友评论

      本文标题:ios分类添加属性

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