美文网首页学习准备
分类(category)添加属性及成员变量

分类(category)添加属性及成员变量

作者: 公子无礼 | 来源:发表于2017-04-26 21:52 被阅读926次

iOS分类:
很多说法是只能添加方法,而不能添加成员变量或属性。
这种说法是不严谨的,并不是绝对不能添加变量。

解释如下:
我们知道在一个类中用@property声明属性,编译器会自动帮我们生成,成员变量和setter/getter,但分类的指针结构体中,根本没有属性列表。所以在分类中用@property声明属性,既无法生成,成员变量也无法生成setter/getter。
因此结论是:我们可以用@property声明属性,编译会通过,但run之后就会崩溃。

既然报错的根本原因是使用了系统没有生成的setter/getter方法,可不可以在手动添加setter/getter来避免崩溃,完成调用呢?
其实是可以的。由于OC是动态语言,方法真正的实现是通过runtime完成的,虽然系统不给我们生成setter/getter,但我们可以通过runtime手动添加setter/getter方法。那具体怎么实现呢?

举例如下:
分类.h

#import "Programmer.h"
@interface Programmer (Category)

@property(nonatomic, copy) NSString *nameWithSetterGetter;// 设置setter/getter方法的属性

- (void) programCategoryMethod;// 分类方法

@end

分类.m

#import "Programmer+Category.h"
#import <objc/runtime.h>

static NSString *nameWithSetterGetterKey = @"nameWithSetterGetterKey";

@implementation Programmer (Category)

@dynamic nameWithSetterGetter;

- (void)setNameWithSetterGetter:(NSString *)nameWithSetterGetter {
        objc_setAssociatedObject(self, &nameWithSetterGetterKey, nameWithSetterGetter, OBJC_ASSOCIATION_COPY);
}

- (NSString *)nameWithSetterGetter {
    return objc_getAssociatedObject(self, &nameWithSetterGetterKey);
}

- (void)programCategoryMethod {
    NSLog(@"实现分类方法");
}
@end

重点就是两个runtime实现方法,如果不写这个,只要你申明了属性,运行肯定会报错;如果加了这两个方法,就能运行通过了,而且,我们在其他地方也能正常使用了

Programmer *programmer = [[Programmer alloc]init];
// 通过runtime实现了setter/getter
programmer.nameWithSetterGetter = @"有setter/getter";    //调用setter,成功
NSLog(@"%@",programmer.nameWithSetterGetter);            //调用getter,成功

------收集

相关文章

  • Category-关联对象

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

  • 分类(category)添加属性及成员变量

    iOS分类:很多说法是只能添加方法,而不能添加成员变量或属性。这种说法是不严谨的,并不是绝对不能添加变量。 解释如...

  • 十六、关联对象

    分类和类别 1: category: 类别,分类 专门用来给类添加新的方法 不能给类添加成员 属性,添加了成员变量...

  • Category关联对象

    一、分类中添加成员变量Category中添加成员变量.png 所以Category中是不能添加成员变量 二、Cat...

  • 十四、关联对象

    分类与类扩展 category∶类别,分类 专门用来给类添加新的方法 不能给类添加成员属性,添加了成员变量,也无法...

  • iOS底层学习:类的扩展和关联对象

    类的扩展和分类 category:分类、类别 给类增加方法 不能添加成员变量 可以使用runtime给分类添加属性...

  • 分类与类扩展以及关联对象

    category分类 专门用来各类添加新的方法。 不能给类添加成员属性,添加了成员变量,也无法取到(注意:其实可以...

  • 类的加载(三)

    类扩展 类扩展 VS 分类 category 专门用来给类添加新的方法 不能给类添加成员属性,添加了成员变量,也...

  • OC中分类的实现原理

    OC中为类添加一个分类(Category)可以实现为类添加对象方法、类方法、添加属性(添加的属性不生成成员变量)、...

  • 分类(category)和类扩展(extension) 详解

    什么时候使用分类(category)呢?比如: 分类(category)中只能添加方法,不能添加成员变量;分类(c...

网友评论

    本文标题:分类(category)添加属性及成员变量

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