iOS - 通过runtime获取某个类中所有的变量和方法

苹果官方的类中只提供给我们一小部分成员变量和方法,但有时候我们需要的恰好就没有提供,这样就会令开发人员十分懊恼了,那怎样才能获取该类中所有的变量及方法,用来查找是否有相对应的变量和方法呢? 我们可以使用苹果自带的 运行时(runtime) 来获取

运行时(Runtime):

  • 苹果官方一套C语言
  • 能做很多底层操作(比如访问隐藏的一些成员变量\成员方法....)

以下以 UITextField 为例

一. 包含运行时头文件

#import <objc/runtime.h>  

二. 获取所有的成员变量

unsigned int count = 0;
    
// 拷贝出所胡的成员变量列表
Ivar *ivars = class_copyIvarList([UITextField class], &count);
    
for (int i = 0; i<count; i++) {
    // 取出成员变量
    Ivar ivar = *(ivars + i);
        
    // 打印成员变量名字
    LXFLog(@"%s", ivar_getName(ivar));
        
    // 打印成员变量的数据类型
    LXFLog(@"%s", ivar_getTypeEncoding(ivar));
}
    
// 释放
free(ivars);

Swift的写法如下

var count: UInt32 = 0
let ivars = class_copyIvarList(UIViewController.self, &count)!
for i in 0..<count {
    let namePoint = ivar_getName(ivars[Int(i)])!
    let name = String(cString: namePoint)
    print(name)
}

三. 获取所有的成员方法

// 下面的UITextField改为你想获取所有属性的类名 // methCount: 这个类所有属性的个数

unsigned int methCount = 0;
Method *meths = class_copyMethodList([UITextField class], &methCount);
    
for(int i = 0; i < methCount; i++) {
        
    Method meth = meths[i];
        
    SEL sel = method_getName(meth);
        
    const char *name = sel_getName(sel);
        
    NSLog(@"%s", name);
}
    
free(meths);

最后,通过KVC的方式给相应的成员变量赋值即可! 如:

// 修改点位文字颜色
UILabel *placeholderLabel = [self valueForKeyPath:@"_placeholderLabel"];
placeholderLabel.textColor = [UIColor redColor];
// 或者这样
[self setValue:[UIColor grayColor] forKeyPath:@"_placeholderLabel.textColor"];

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏猿份到

LeakCanary源码浅析

在Android开发中最让人们头疼的就是内存泄漏了,今天来介绍一个查看内存是否泄漏的工具LeakCanary,并通过研究源码明白它是如何分析和查找存在泄漏信息的...

3295
来自专栏Java技术栈

跟我学 Java 8 新特性之 Stream 流(二)关键知识点

我们的第一篇文章,主要是通过一个Demo,让大家体验了一下使用流API的那种酣畅淋漓的感觉。如果你没有实践,我还是再次呼吁你动手敲一敲,自己实实在跑一遍上一篇的...

1054
来自专栏函数式编程语言及工具

深圳scala-meetup-20180902(1)- Monadic 编程风格

刚完成了9月份深圳scala-meetup,趁刮台风有空,把我在meetup里的分享在这里发表一下。我这次的分享主要分三个主题:“Monadic编程风格“、...

773
来自专栏Golang语言社区

一日一学_Go语言Context(设计及分析)

Go服务器的每个请求都有自己的goroutine,而有的请求为了提高性能,会经常启动额外的goroutine处理请求,当该请求被取消或超时,该请求上的所有gor...

3107
来自专栏小狼的世界

Javascript设计模式学习(三)更多的高级样式

if (hid != null && hid != undefined & hid != "") {

682
来自专栏程序员宝库

关于 Java 你不知道的 10 件事

作为 Java 书呆子,比起实用技能,我们会对介绍 Java 和 JVM 的概念细节更感兴趣。因此我想推荐 Lukas Eder 在 jooq.org 发表的原...

3526
来自专栏草根专栏

设计模式学习(四): 1.简单工厂 (附C#实现)

New ? ? 这是一个典型的情况, 我们需要在运行时来实例化一些具体的类. 在需要修改或者扩展的时候我们就需要改这段代码. 一个程序中可能会多次出现类似的代码...

2816
来自专栏desperate633

LintCode 有效回文串题目分析代码

给定一个字符串,判断其是否为一个回文串。只包含字母和数字,忽略大小写。 ** 注意事项** 你是否考虑过,字符串有可能是空字符串?这是面试过程中,面试官常常...

702
来自专栏好好学java的技术栈

一文看透java8新特性

毫无疑问,Java 8发行版是自Java 5(发行于2004,已经过了相当一段时间了)以来最具革命性的版本。Java 8 为Java语言、编译器、类库、开发工具...

712
来自专栏余林丰

Effective Java通俗理解(下)

第31条:用实例域代替序数   枚举类型有一个ordinal方法,它范围该常量的序数从0开始,不建议使用这个方法,因为这不能很好地对枚举进行维护,正确应该是利用...

1929

扫码关注云+社区