本文主要介绍一下如何访问类的私有成员变量以及类的私有方法,这里以下面这个类来举例:
@interface HomeController : UIViewController {
NSString *name2;
}
@property (nonatomic,copy) NSString *name3;
@end
@interface HomeController (){
int index;
NSString *name1;
}
@property (nonatomic,strong) UILabel *msgLbl;
@end
@implementation HomeController
- (void)viewDidLoad {
[superviewDidLoad];
self.msgLbl = [[UILabelalloc] init];
self.msgLbl.font = [UIFont systemFontOfSize:14];
self.msgLbl.textColor = [UIColorblackColor];
self.msgLbl.text =@"主界面";
self.msgLbl.textAlignment = NSTextAlignmentLeft;
self.msgLbl.backgroundColor = [UIColorclearColor];
[self.viewaddSubview:self.msgLbl];
[selfgetPropertyList];
[selfgetIvarList];
[selfgetInstanceMethodList];
[selfgetClassMethodList];
}
- (void)viewDidLayoutSubviews {
[superviewDidLayoutSubviews];
self.msgLbl.frame =CGRectMake(20,40, 60, 20);
}
+ (void)classMethod {
NSLog(@"*** private class methods");
}
//获取类的属性
- (void)getPropertyList {
//属性个数
unsigned int count;
objc_property_t *properties = class_copyPropertyList([self class], &count);
for (int i =0; i < count; i++) {
objc_property_t property = properties[i];
const char *name =property_getName(property);
NSString *nameStr = [NSStringstringWithCString:name encoding:NSUTF8StringEncoding];
NSLog(@"***属性名:%@", nameStr);
}
free(properties);
}
//获取类的成员变量
- (void)getIvarList {
unsigned int count;
Ivar *ivarList = class_copyIvarList([self class], &count);
for (int i =0; i < count; i++) {
NSString *nameStr = [NSStringstringWithUTF8String:ivar_getName(ivarList[i])];
NSLog(@"***ivarName:%@", nameStr);
}
free(ivarList);
}
//获取一个类的实例方法列表
- (void)getInstanceMethodList {
unsigned int count;
Method *methods = class_copyMethodList([self class], &count);
for (int i =0; i < count; i++) {
SEL name = method_getName(methods[i]);
NSLog(@"***实例方法名:%@",NSStringFromSelector(name));
}
free(methods);
}
//获取一个类的类方法列表
- (void)getClassMethodList {
unsigned int count;
// const char * class_name = class_getName([self class]);
// Class metaClass = objc_getMetaClass(class_name);
Method *methods =class_copyMethodList(object_getClass([selfclass]), &count);
for (int i =0; i < count; i++) {
SEL name = method_getName(methods[i]);
NSLog(@"***类方法名:%@",NSStringFromSelector(name));
}
free(methods);
}
- (void)privateMethod {
NSLog(@"*** private instance methods");
}
1.如何访问类的私有成员变量,有两种方法:KVC和RunTime机制,我们可以通过上述类中的getIvarList方法来获取类的所有成员变量,经过和类的.h文件比较,如果不在.h文件中出现的则为其私有成员变量.这里我们拿name1这个私有成员变量来举例:
通过RunTime来设置:
HomeController *homeVC = [HomeController new];
Ivar ivar = class_getInstanceVariable([homeVC class], [@"name1" UTF8String]);
const char *ivarType = ivar_getTypeEncoding(ivar);
NSLog(@"*** ivar type:%@", [[NSString alloc] initWithCString:ivarType encoding:NSUTF8StringEncoding]);
object_setIvar(homeVC, ivar, @"pwf2006");
NSString *ivarValue = object_getIvar(homeVC, ivar);
NSLog(@"*** ivar value:%@", ivarValue);
输出结果如下:
2016-08-19 22:31:58.240 FirstGit[18695:7136558] *** ivar type:@"NSString"
2016-08-19 22:31:58.240 FirstGit[18695:7136558] *** ivar value:pwf2006
通过KVC来设置:
[homeVC setValue:@"pwf2007"forKey:@"name1"];
NSLog(@"*** ivar value:%@", [homeVCvalueForKey:@"name1"]);
输出结果如下:
2016-08-19 22:31:58.241 FirstGit[18695:7136558] *** ivar value:pwf2007
2.通过getInstanceMethodList方法我们可以获取类实例的所有方法,包括私有的方法,我们拿privateMethod来进行举例:
objc_msgSend(homeVC,@selector(privateMethod));
输出结果如下:
2016-08-19 22:31:58.241 FirstGit[18695:7136558] *** private instance methods
通过getClassMethodList获取一个类的类方法列表,包括私有的类方法,我们拿classMethod这个类方法举例:
objc_msgSend([homeVC class],@selector(classMethod));
输出结果如下:
2016-08-19 22:31:58.241 FirstGit[18695:7136558] *** private class methods