美文网首页
Runtime之动态创建类,实例变量

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

作者: One9398 | 来源:发表于2016-02-23 08:32 被阅读564次

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

    相关文章

      网友评论

          本文标题:Runtime之动态创建类,实例变量

          本文链接:https://www.haomeiwen.com/subject/gpavkttx.html