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