通过<objc/runtime.h>实现,代码如下:
- (instancetype)init
{
self = [super init];
if (self) {
// 获取所有的成员变量
unsigned int outCount = 0;
Ivar * varList = class_copyIvarList([self class], &outCount);
for (int i = 0; i<outCount; ++i) {
Ivar ivar = varList[i];
//1.获取成员变量名字
NSString *ivarname = [NSString stringWithUTF8String:ivar_getName(ivar)];
if ([ivarname hasPrefix:@"_"]) {
//把 _ 去掉,读取后面的
ivarname = [ivarname substringFromIndex:1];
}
//2.获取成员变量类型
NSString * ivartype = [NSString stringWithUTF8String:ivar_getTypeEncoding(ivar)];
//把包含 @\" 的去掉,如 "@\"nsstring\"";-="">
NSString * ivarType = [ivartype stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"@\""]];
NSLog(@"ivarType=%@,ivarname=%@",[self typeWithIvarType:ivarType],ivarname);
}
}
return self;
}
-(NSString*)typeWithIvarType:(NSString*)ivarType{
NSString * typeString = @"";
if(![ivarType isKindOfClass:[NSString class]]){
return typeString;
}
if([ivarType isEqualToString:@"i"]){
typeString = @"int";
}else if([ivarType isEqualToString:@"f"]){
typeString = @"float";
}else if([ivarType isEqualToString:@"d"]){
typeString = @"double|CGFloat";
}else if([ivarType isEqualToString:@"q"]){
typeString = @"NSInteger";
}else if([ivarType isEqualToString:@"B"]){
typeString = @"BOOL";
}else{
typeString = ivarType;
}
return typeString;
}