全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

IOS 中runtime使用方法整理

IOS 中runtime使用方法整理

做iOS的朋友都知道或听说runtime,这个东西很像java的反射机制,但功能远胜于java的反射。通过runtime我们可以动态的向一个类中添加属性、成员变量、方法,以及对其进行读写访问。

新建两个类ClassOne和ClassTwo

#import <Foundation/Foundation.h>

@interface ClassOne : NSObject{
  NSString *_publicVar1;
  NSString *_publicVar2;
}

@property(nonatomic,copy) NSString *publicProperty1;
@property(nonatomic,copy) NSString *publicProperty2;

- (void) testClassOneWithArg1:(NSString *)arg1;
@end


#import "ClassOne.h"

@interface ClassOne()
@property(nonatomic,copy) NSString *privateProperty1;
@property(nonatomic,copy) NSString *privateProperty2;

@end

@implementation ClassOne{
    NSString *_privateVar1;
    NSString *_privateVar2;
}

- (void)testClassOneWithArg1:(NSString *)arg1{
  NSLog(@"this is CalssOne, arg1:%@",arg1);
}

- (void)testClassOneWithArg1:(NSString *)arg1 arg2:arg2{
  NSLog(@"this is CalssOne, arg1:%@ arg2:%@",arg1,arg2);
}
@end

#import <Foundation/Foundation.h>

@interface ClassTwo : NSObject
- (void) testClassTwoWithArg1:(NSString *)arg1 arg2:(NSString *)arg2;
@end


#import "ClassTwo.h"

@implementation ClassTwo
- (void)testClassTwoWithArg1:(NSString *)arg1 arg2:(NSString *)arg2{
  NSLog(@"this is ClassTwo arg1:%@,arg2:%@",arg1,arg2);
}
@end

1.拷贝对象

ClassOne *one = [ClassOne new];
id onec1 = object_copy(one,sizeof(one));

2.给类添加方法

ClassOne *one = [ClassOne new];
class_addMethod([ClassOne class], @selector(testClassOneWithArg1:arg2:arg3:), (IMP)testClassOne , "i@:@@@");
[one testClassOneWithArg1:@"arg1" arg2:@"arg2" arg3:@"arg3"];

//方法对应的C函数
int testClassOne(id self,SEL _cmd, NSString *arg1,NSString *arg2,NSString *arg3){
NSLog(@"this is a test function add to ClassOne as a methad with arg1:%@ arg2:%@ and arg3:%@",arg1,arg2,arg3);
  return 10;
}

3.添加属性(方式一)

//属性类型
objc_property_attribute_t type = { "T", "@\"NSString\"" };
//访问类型
objc_property_attribute_t ownership = { "C", "" };
//对应成员变量名称
objc_property_attribute_t backingivar = { "V", "_testPropertyName" };
objc_property_attribute_t attrs[] = { type, ownership, backingivar };
class_addProperty([ClassOne class], "testPropertyName", attrs, 3);
class_addMethod([ClassOne class], @selector(testPropertyName), (IMP)testPropertyNameGetter , "@:@@");
class_addMethod([ClassOne class], @selector(setTestPropertyName:), (IMP)testPropertyNameSetter, "v:@@@");


//属性对应的Getter方法
NSString* testPropertyNameGetter(id self,SEL _cmd){
  Ivar ivar = class_getInstanceVariable([ClassOne class], "_testPropertyName");
  return object_getIvar(self, ivar);
}

//属性对应的Setter方法
void testPropertyNameSetter(id self,SEL _cmd,NSString *testPropertyNameValue){
  Ivar ivar = class_getInstanceVariable([ClassOne class], "_testPropertyName");
  object_setIvar(self, ivar, testPropertyNameValue);
}

4.添加属性(方式2)

ClassOne *one = [ClassOne new];
objc_setAssociatedObject(one, "objTag", @"value", OBJC_ASSOCIATION_COPY);
NSString *value = objc_getAssociatedObject(one, "objTag");
NSLog(@"通过Associate设置:%@",value);

5.获取类的名称

ClassOne *one = [ClassOne new];
const char *className = object_getClassName(one);
NSLog(@"className:%@",[NSString stringWithUTF8String:className]);

6.获取一个类的所有方法

UInt count;
Method *methods = class_copyMethodList([ClassOne class], &count);
for (int i = 0; i < count; i++) {
  Method method = methods[i];
  SEL sel = method_getName(method);
  NSLog(@"方法名:%@",NSStringFromSelector(sel));
}

7.获取一个类的所有属性

uint propertyCount;
objc_property_t *ps = class_copyPropertyList([ClassOne class], &propertyCount);
for (uint i = 0; i < propertyCount; i++) {
  objc_property_t property = ps[i];
  const char *propertyName = property_getName(property);
  const char *propertyAttributes = property_getAttributes(property);
  NSLog(@"propertyName:%@",[NSString stringWithUTF8String:propertyName]);
  NSLog(@"propertyAttributes:%@",[NSString stringWithUTF8String:propertyAttributes]);
}

8.获取类的所有成员变量

uint ivarCount;
Ivar *ivars = class_copyIvarList([ClassOne class], &ivarCount);
for (uint i = 0; i < ivarCount; i++) {
  Ivar ivar = ivars[i];
  const char *ivarName = ivar_getName(ivar);
  NSLog(@"ivarName:%@",[NSString stringWithUTF8String:ivarName]);
}

9.获得成员变量类型

uint ivarCount;
Ivar *ivars = class_copyIvarList([ClassOne class], &ivarCount);
for (uint i = 0; i < ivarCount; i++) {
  Ivar ivar = ivars[i];
  const char *ivarName = ivar_getName(ivar);
  const char *type = ivar_getTypeEncoding(ivar);
  NSLog(@"ivarName=%@,type=%@",[NSString stringWithUTF8String:ivarName],[NSString stringWithUTF8String:type]);
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# iOS中runtime的使用总结  # iOS  # runtime使用方法  # 总结iOS中runtime的使用  # iOS runtime forwardInvocation详解及整理  # iOS使用runtime修改文本框(TextField)的占位文字颜色  # iOS runtime动态添加方法示例详解  # iOS通过Runtime实现友盟统计的实例代码  # IOS Object-C 中Runtime详解及实例代码  # iOS利用Runtime实现友盟页面数据统计的功能示例  # iOS runtime知识梳理  # iOS中Runtime的几种基本用法记录  # iOS Runtime详解(新手也看得懂)  # 我们可以  # 对其  # 希望能  # 谢谢大家  # 很像  # 类中  # 远胜于  # id  # sizeof  # object_copy  # implementation  # CalssOne  # NSLog  # test  # _cmd  # SEL  # function  # return  # methad  # add 


相关文章: 小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化  大连 网站制作,大连天途有线官网?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  定制建站价位费用解析与套餐推荐全攻略  建站之星安装模板失败:服务器环境不兼容?  建站VPS能否同时实现高效与安全翻墙?  建站之星如何快速更换网站模板?  电脑免费海报制作网站推荐,招聘海报哪个网站多?  宁波自助建站系统如何快速打造专业企业网站?  如何获取免费开源的自助建站系统源码?  制作网站外包平台,自动化接单网站有哪些?  如何在云指建站中生成FTP站点?  如何实现建站之星域名转发设置?  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  如何用低价快速搭建高质量网站?  建站之星代理如何获取技术支持?  如何用花生壳三步快速搭建专属网站?  建站之星上传入口如何快速找到?  如何撰写建站申请书?关键要点有哪些?  潍坊网站制作公司有哪些,潍坊哪家招聘网站好?  如何获取PHP WAP自助建站系统源码?  如何快速搭建高效WAP手机网站吸引移动用户?  活动邀请函制作网站有哪些,活动邀请函文案?  枣阳网站制作,阳新火车站打的到仙岛湖多少钱?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  建站之星安装步骤有哪些常见问题?  如何通过主机屋免费建站教程十分钟搭建网站?  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  简易网站制作视频教程,使用记事本编写一个简单的网页html文件?  建站之星云端配置指南:模板选择与SEO优化一键生成  家具网站制作软件,家具厂怎么跑业务?  建站之星在线版空间:自助建站+智能模板一键生成方案  网站制作话术技巧,网站推广做的好怎么话术?  深圳企业网站制作设计,在深圳如何网上全流程注册公司?  代刷网站制作软件,别人代刷火车票靠谱吗?  学校为何禁止电信移动建设网站?  实例解析Array和String方法  电商网站制作公司有哪些,1688网是什么意思?  建站之星微信建站一键生成小程序+多端营销系统  网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?  小型网站建站如何选择虚拟主机?  建站之星安全性能如何?防护体系能否抵御黑客入侵?  网站建设设计制作营销公司南阳,如何策划设计和建设网站?  香港服务器选型指南:免备案配置与高效建站方案解析  利用JavaScript实现拖拽改变元素大小  如何选择适合PHP云建站的开源框架?  建站主机系统SEO优化与智能配置核心关键词操作指南  php8.4新语法match怎么用_php8.4match表达式替代switch【方法】  如何在宝塔面板创建新站点? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。