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