ios 访问或修改私有变量的方式

2017-11-10  本文已影响0人  一个没有记忆的梦

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

使用以上两种方式就可以获取并修改所谓的私有变量值啦,赶紧试试吧!

上一篇 下一篇

猜你喜欢

热点阅读