Runtime之动态创建类,实例变量

在学习iOS过程中,慢慢地接触到了Objective-C里高级语法,了解到AOP编程的独特之处,感受到了其强大。想借此暂时简单记录下现在对于Objc运行时语法的运用。

首先,使用运行时API,就要包含

#import <objc/runtime.h>
#import <objc/message.h>

创建并注册类和成员变量

Class WidgetClass = objc_allocateClassPair([NSObject class], "Widget", 0); 
#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wundeclared-selector" 
// 参数type 特殊编码要求 v-void @-self(id)
class_addMethod(WidgetClass, @selector(display), (IMP)display, "v@:"); 
#pragma clang diagnostic pop 
/** * 为 类 添加实例变量 */
char const *height = "height";
class_addIvar(WidgetClass, height, sizeof(id), log2(sizeof(id)), "@");
objc_registerClassPair(WidgetClass);

使用动态创建的类

id widget = [[WidgetClass alloc]init];
NSNumber *value = [NSNumber numberWithInt:10];
[widget setValue:value forKey:[NSString stringWithUTF8String:height]];
NSLog(@"%@---%@",[widget valueForKey:[NSString stringWithUTF8String:height]],[[widget valueForKey:[NSString stringWithUTF8String:height]] class]);

给创建的类实例添加一个成员变量

NSNumber *width = [NSNumber numberWithInt:15];
const char *key = "width";
objc_setAssociatedObject(widget,key,width,OBJC_ASSOCIATION_RETAIN_NONATOMIC);
id result = objc_getAssociatedObject(widget,key);

总结

1.首先定义一个方法的实现参数(c函数,必有两个参数self , _cmd )
2.创建并且注册一个类以及它的metaClass
3 创建一个类的实例
4.动态方式给实例添加一个变量 (可用于在分类中添加实例变量)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,268评论 19 139
  • 这篇文章完全是基于南峰子老师博客的转载 这篇文章完全是基于南峰子老师博客的转载 这篇文章完全是基于南峰子老师博客的...
    西木阅读 30,696评论 33 466
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,839评论 18 399
  • 早上醒来,症状并没有好转,心想着得去医院看看了,否则天天都会这样了。 头发长了,不能剪,临放假回家的时候再剪才合适...
    写作不飘逸阅读 130评论 0 0
  • 人之气质,由于天生,本难改变,惟读书则可改变气质。余三十岁前最好吃芋,(抽烟)片刻不停。后来立志戒芋,至今不在吃。...
    大張冰阅读 288评论 1 4