iOS之OC深入理解

OC分类中增加属性

2017-09-01  本文已影响1172人  Alfred的记录本

原来看别人的文章介绍说分类中无法增加属性,但是看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)));
    }
}

上一篇下一篇

猜你喜欢

热点阅读