iOS中私有变量之说,是不绝对的,没有绝对的私有变量。有时候我们需要访问在.m文件中声明的属性变量或者在.h文件中用@private修改的私有变量,有两种方式:kvc、runtime
首先创建一个类YLPrivateModel
YLPrivateModel.h文件
#import <Foundation/Foundation.h>
@interface YLPrivateModel : NSObject
- (void)last;
- (void)next;
@end
YLPrivateModel.m文件
#import "YLPrivateModel.h"
@interface YLPrivateModel()
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger age;
@end
@implementation YLPrivateModel
- (instancetype)init {
if (self = [super init]) {
self.name = @"Jerry";
self.age = 21;
}
return self;
}
- (void)last {
NSLog(@"修改之前:%@", self.name);
}
- (void)next {
NSLog(@"修改之后:%@", self.name);
}
1、使用kvc (前提是必须知道私有变量名)
实现方式如下:在需要访问的地方调用(如;我是在YLPrivateViewController类中调用)
YLPrivateModel *model = [[YLPrivateModel alloc] init];
[model last];
//这里的name是要访问的变量名
[model setValue:@"hello" forKeyPath:@"name"];//使用KVC方式访问 可以修改 前提是必须知道变量名
[model next];
这样就可以访问并且完成了修改私有变量。
log如下:
0E1652B2-66C6-4ED9-87CA-84DAB20B1E59.png
2.使用runtime方式访问
首先导入runtime所需要的库 #import <objc/runtime.h>
实现方式如下:在需要访问的地方调用(如;我是在YLPrivateViewController类中调用)
YLPrivateModel *model = [[YLPrivateModel alloc] init];
[model last];
unsigned int count = 0;
Ivar *mems = class_copyIvarList([YLPrivateModel class], &count);
for (int i = 0; i < count; i++) {
Ivar pr = mems[i];
const char *privateName = ivar_getName(pr);
NSLog(@"使用runtime:%s", privateName);
}
Ivar name = mems[0];
object_setIvar(model, name, @"改变runtime的值");
[model next];
注:在for循环中可以获取所有私有变量的值
log如下:
15DD028A-6DB4-4417-980A-7FEABA5C12B7.png
使用以上两种方式就可以获取并修改所谓的私有变量值啦,赶紧试试吧!
网友评论