原來看別人的文章介紹說分類中無法增加屬性,但是看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)));
}
}