OC分类中增加属性

作者: Alfred的记录本 | 来源:发表于2017-09-01 11:52 被阅读1172次

原来看别人的文章介绍说分类中无法增加属性,但是看AFN,MJRefresh等开源库,发现很多都在分类中定义了属性,所以又翻阅了下资料,发现这句话应该改成:“分类中无法增加成员变量”,另外把OC中如何增加属性总结如下:
1、类中增加属性, 例如下面代码,系统会做4件事情,1)增加成员变量_age; 2)属性age,3)setAge方法,4)age方法。

@interface Animal : NSObject
@property (nonatomic, strong) NSString *age;
@end

2、类别中增加属性,例如下面代码,只会增加属性eyeColor(不会增加成员变量_eyeColor),而且.m文件中会提示没有eyeColor方法,和没有setEyeColor方法。

@interface Animal (Cat)
@property (nonatomic, strong) NSString *eyeColor;
@end

增加set get方法后,不再报错,但是由于没有生成eyeColor的成员变量,而且分类无法增加成员变量(无法用 return _eyeColor),所以set get方法没有实际功能。

- (NSString *) eyeColor{
    return @"";
}
-(void) setEyeColor:(NSString *)eyeColor{

}

3、通过runtime 实现set get的功能,由于也声明了属性,可以根据“点”进行直接调用set get方法,这样就跟普通的类没什么区别了。

#import <objc/runtime.h>
@implementation Animal (Cat)
- (NSString *) eyeColor{
    return objc_getAssociatedObject(self, @"eyeColor");;
}
-(void) setEyeColor:(NSString *)eyeColor{
    objc_setAssociatedObject(self, @"eyeColor", eyeColor, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
@end
animal.eyeColor = @"blue";
  • 另,可以通过如下方法,获取类的成员变量,属性,方法。
- (void) printAnimalVar {
    // 获取成员变量
    unsigned int ivarCount = 0;
    Ivar *ivars = class_copyIvarList([Animal class], &ivarCount);
    for (int i = 0; i < ivarCount; i++) {
        Ivar ivar = ivars[i];
        NSLog(@"第%d个成员变量:%s",i,ivar_getName(ivar));
    }
    free(ivars);

}

- (void) printAnimalProperty {
    // 获取属性
    unsigned int propertyCount = 0;
    objc_property_t *propertyList = class_copyPropertyList([Animal class], &propertyCount);
    for (int i = 0; i < propertyCount; i++) {
        objc_property_t property = propertyList[i];
        NSLog(@"第%d个属性:%s",i,property_getName(property));
    }
    
}

- (void) printAnimalMethod {

    // 获取方法列表
    unsigned int methodCount = 0;
    Method *methods = class_copyMethodList([Animal class], &methodCount);
    for (int i = 0; i < methodCount; i++) {
        Method method = methods[i];
        
        NSLog(@"第%d个方法:%s",i, sel_getName(method_getName(method)));
    }
}

相关文章

  • OC分类中增加属性

    原来看别人的文章介绍说分类中无法增加属性,但是看AFN,MJRefresh等开源库,发现很多都在分类中定义了属性,...

  • Swift 分类中的只读计算属性的运用

    我们都知道在OC中,在分类中增加新的属性是会报错的,如果非要增加属性比较使用runtime大招才行这个状况在Swi...

  • Category关联对象

    OC中的分类严格来说,是不能添加对象;但是我们可以通过OC运行是的机制,动态为分类添加属性 一、类中的属性 当在类...

  • Swift— 便利构造器 (extension)

    * extension相当于OC中的分类, 特点和OC中的分类一样 * 不能定义存储属性 * 如果想给系统的类新增...

  • Runtime了解?说下项目中什么地方用到Runtime?

    OC利用Runtime运行时变成一门动态语言 Runtime中的可以解决的问题:1.为分类增加属性常规定义 @pr...

  • 2018-04-01

    oc中对于类的属性声明和实现其getter和setter方法,oc 2.0中增加了属性声明,就是可以不用单独为每一...

  • 2018-04-01

    oc中对于类的属性声明和实现其getter和setter方法,oc 2.0中增加了属性声明,就是可以不用单独为每一...

  • iOS开发-RunTime的简单应用

    RunTime在开发中的主要应用场景: 给分类增加属性 交换方法 一、给分类增加属性 1.控制button的响应区...

  • UIAlertView关联属性 + 分类

    UIAlertView关联属性 UIAlertView 分类 增加block属性

  • OC-关联对象

    分类(Category):是OC中的特有语法,它是表示一个指向分类的结构体指针。原则上它只能增加方法,不能增加成员...

网友评论

    本文标题:OC分类中增加属性

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