美文网首页
ios 访问或修改私有变量的方式

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

作者: 一个没有记忆的梦 | 来源:发表于2017-11-10 17:00 被阅读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

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

相关文章

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

    iOS中私有变量之说,是不绝对的,没有绝对的私有变量。有时候我们需要访问在.m文件中声明的属性变量或者在.h文件中...

  • iOS 访问和修改类的私有变量

    1、使用KVC,新建一个 USer 类 修改 打印结果:修改之前:initName -- initType修改之后...

  • iOS面试题收集(一)

    如何访问并修改一个类的私有属性? 1.通过KVC获取2.通过runtime访问并修改私有属性 iOS 的沙盒目录结...

  • [iOS]访问私有变量

    访问对象私有变量的方法有两中 KVC 和 Runtime机制 今天主要说一下KVC吧,runtime有时间单独...

  • 闭包

    闭包:解决变量的私有化问题全局变量:谁都可以访问,修改局部变量:有生命周期

  • ios 如何访问私有变量

    写一个TestObject类 代码如下TestObject.h TestObject.m 方式一 使用KVC方式 ...

  • iOS 如何访问私有变量

    方法1: 如果你能看到类的实现以及私有成员,可以使用kvc 设置私有成员: - (void)setValue:(n...

  • Objective-C 目录

    001、ViewController生命周期002、self 与 super003、访问和修改类的私有变量004、...

  • class 中的 getters 和 setter

    想在类的外部访问私有变量我们可以使用 getter 方法,用 get 关键字声明: 演示: 同样的想在外部修改私有...

  • iOS:如何访问一个对象的私有属性?(一)

    在下对于访问一个对象的私有变量或者是对象的父类的私有变量给出了两种不同的方式。通过KVC和runtime的方式,此...

网友评论

      本文标题:ios 访问或修改私有变量的方式

      本文链接:https://www.haomeiwen.com/subject/awobmxtx.html