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.动态方式给实例添加一个变量 (可用于在分类中添加实例变量)

    原文作者:One9398
    原文地址: https://www.jianshu.com/p/f76597b85a96
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞