美文网首页
Runtime自我总结

Runtime自我总结

作者: 人活一世 | 来源:发表于2017-03-27 23:27 被阅读0次

    1.获取类的成员变量

    //定义一个整数来接收,所需获取的类的属性个数

    unsigned int count =0;

    /*

    参数一:对象的类名

    参数二:用来接收属性个数的 整型

    */

    Ivar *ivars  = class_copyIvarList(objc_getClass("类的名称"),&count);

    //取出所获取的属性

    for(int i = 0; i < count; i++) {

    //拿出一个一个的成员变量

    Ivar ivar = ivars[i];

    //获取属性的名字

    const char * name = ivar_getName(ivar);

    //将C类型的字符串转换成Object-C类型的字符串

    NSString * ocName = [NSString stringWithUTF8String:name];

    NSLog(@"%@",ocName);

    }

    2.获取类的方法

    /*

    参数一:  对象的类名

    参数二:  所要获取的方法

    */

    Method imageNamedMethod = class_getClassMethod(objc_getClass("类的名称"),@selector(imageNamed:));

    Method xmg_imageNamedMethod = class_getClassMethod(objc_getClass("类的名称"),@selector(xmg_imageNamed:));

    //交互方法runtime, 这个很少用

    method_exchangeImplementations(imageNamedMethod, xmg_imageNamedMethod);

    /*

    调用imageNamed -> xmg_imageNamed

    调用xmg_imageNamed -> imageNamed

    */

    3. 动态添加属性

    /*

    参数一object:给哪个对象添加属性

    参数二key:属性名称

    参数三value:属性值

    参数四policy:保存存策略

    */

    objc_setAssociatedObject(self,@"name", name,OBJC_ASSOCIATION_RETAIN_NONATOMIC);

    4.消息机制

    //OC

    //HKPerson *p = [HKPerson alloc];

    //p = [p init];

    //C

    Person *p = objc_msgSend(objc_getClass("Person"),sel_registerName("alloc"));

    p = objc_msgSend(p,sel_registerName("init"));

    //调用eat无参数方法

    objc_msgSend(p,@selector(eat));

    //调用run有参数方法@selector(run:)后依奖填写要传入的参数

    objc_msgSend(p,@selector(run:),20);

    相关文章

      网友评论

          本文标题:Runtime自我总结

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