OC runtime 笔记 NSCopying协议

执行方法/通过字符串获得SEL

performSelector: 可绕过编译器,执行没在接口里面的方法

NSSelectorFromString 返回值(SEL) 将一个字符串 -> 方法

给类添加实例变量

可以动态给类添加实例变量
    //添加
    objc_setAssociatedObject(<#id object#>, <#const void *key#>, <#id value#>, objc_AssociationPolicy policy)
    objc_setAssociatedObject(self, cKey, value, OBJC_ASSOCIATION_COPY)
    //取值
    objc_getAssociatedObject(<#id object#>, <#const void *key#>)
    objc_getAssociatedObject(self, cKey);

KVC 批量化赋值

获取一个类的所有实例变量

#import <objc/objc-runtime.h>

class_copyIvarList(<#__unsafe_unretained Class cls#>, <#unsigned int *outCount#>)

获取一个类的所有实例变量(返回一个数组,类型是Ivar)

参数1:Class -> 例: [self class]
参数2: counts -> 记录实例变量个数 //传进去的值为 0

    
    unsigned int count = 0;
    Ivar *ivars = class_copyIvarList([self class], &count);
    for (int i = 0; i<count; i++) {
        
        const char *cKey = ivar_getName(ivars[i]);
        //实例变量key
        NSString *ocInstanceKey = [NSString stringWithCString:cKey encoding:NSUTF8StringEncoding];
        //编码key
        NSString *coderKey = [@"k" stringByAppendingString:ocInstanceKey];

        callback(ocInstanceKey,coderKey);
    }

交换两个方法的实现(IMP)

实例方法-SEL和IMP

    Method A = class_getClassMethod([self class], @selector(demofunA));
    Method B = class_getClassMethod([self class], @selector(demofunB));
    method_exchangeImplementations(A, B);

NSCopying协议

@interface Animal ()<NSCopying>

@end
@implementation Animal

- (id)copyWithZone:(NSZone *)zone{

    Animal *animal_copy = [[self class]allocWithZone:zone];
   
    animal_copy.name = self.name;
    animal_copy.age = self.age ;
//    animal_copy.cat = self.cat;
    animal_copy.dog = [self.dog copy];
    return animal_copy;
}

@end

objc_msgSend(消息发送)

    void (*action)(id, SEL) = (void (*)(id, SEL))objc_msgSend;
    action(person,NSSelectorFromString(@"eat"));

在objc动态编译时,会被转意为objc_msgSend(per,@selector(eat);

其中,void (*action)(id, SEL*)定义了一个函数指针action,函数的输入值为(id, SEL)(如果带参数,则在SEL后加)。(void (*)(id, SEL))objc_msgSend则将objc_msgSend转换为相应的函数指针,并赋值给action。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,899评论 0 9
  • 这篇文章完全是基于南峰子老师博客的转载 这篇文章完全是基于南峰子老师博客的转载 这篇文章完全是基于南峰子老师博客的...
    西木阅读 30,808评论 33 466
  • 我们常常会听说 Objective-C 是一门动态语言,那么这个「动态」表现在哪呢?我想最主要的表现就是 Obje...
    Ethan_Struggle阅读 6,630评论 0 7
  • 前言 runtime其实在我们日常开发过程中很少使用到,尤其是像我现在比较初级的程序猿就更用不到了。但是去面试很多...
    WolfTin阅读 4,130评论 0 2
  • 继上Runtime梳理(四) 通过前面的学习,我们了解到Objective-C的动态特性:Objective-C不...
    小名一峰阅读 4,160评论 0 3

友情链接更多精彩内容