Skip to content

本Demo主要是使用OC的Runtime特性来提高项目的性能和安全性

License

Notifications You must be signed in to change notification settings

GeeksChen/GCRuntimeDemo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

GCRuntimeDemo

本Demo主要是使用OC的Runtime特性来提高项目的性能和安全性

我们可以运用runtime机制做一些事情,动态的获取类的一些属性和方法,动态添加方法和方法交换。

1、获取类名 动态获取类名,使用class_getName(Class)就可以在运行时来获取类的名称。class_getName()函数返回的是一个char类型的指针,也就是C语言的字符串类型,所以我们要将其转换成NSString类型,然后在返回出去。

NSString *className = [GCRuntimeKit fetchClassName:[Test class]];
NSLog(@"获取类名:%@",className);

2、获取成员变量 获取类的成员变量,使用ivar_getTypeEncoding()来获取相应成员变量的类型。使用ivar_getName()来获取相应成员变量的名称。

NSArray *ivarList = [GCRuntimeKit fetchIvarList:[Test class]];
NSLog(@"获取类成员变量:%@",ivarList);

3、获取成员属性 获取有setter和getter方法的成员变量,主要使用class_copyPropertyList(Class,&count)来获取属性列表,然后通过for循环来获取每个属性的名字。注意,使用property_getName()获取到的名字依然是C语言的char类型。

NSArray *proList = [GCRuntimeKit fetchPropertyList:[Test class]];
NSLog(@"获取属性列表:%@",proList);

4、获取类的实例方法 通过class_copyMethodList()方法获取类的实例方法列表,然后通过for循环使用method_getName()来获取每个方法的名称,然后将方法的名称转换成NSString类型,存储在数组中,并返回。

NSArray *methodList = [GCRuntimeKit fetchMethodList:[Test class]];
NSLog(@"获取实例方法:%@",methodList);

5、获取协议列表 通过class_copyProtocolList()来获取列表,然后通过for循环使用protocol_getName()来获取协议的名称,最后将其转换成NSString类型放入数组中,并返回。

NSArray *protocolList = [GCRuntimeKit fetchProtocolList:[Test class]];
NSLog(@"获取协议列表:%@",protocolList);

6、动态添加属性

Test *test = [Test new];
test.dynamicAddPro = @"动态添加属性";

7、动态添加方法

[test performSelector:@selector(addMethod:) withObject:@"动态添加方法"];

8、交换方法

[test swwingMethod];
[test method1];

简书地址

About

本Demo主要是使用OC的Runtime特性来提高项目的性能和安全性

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published