反射机制

获取Class对象

Class对象其实本质上就是一个结构体,这个结构体中的成员变量还是自己,这种设计方式非常像链表的数据结构。
  typedef struct objc_class *Class;
  struct objc_class {
    Class isa OBJC_ISA_AVAILABILITY;
  }
可以直接用一个实例对象或者类对象,直接调用Class方法,都可以获取Class 对象。我们调用下面三个方法,都可以获得Class对象。
// 在实例方法中通过self调用class实例方法获取类对象
[self class];
// 通过ViewController类直接调用class类方法获取类对象
+ (Class *)classMethod {
      return [self class];
  }
通过打印,我们发现调用这三个方法,获取到的类对象是同一个类对象,内存地址也是一样的。

这是因为这三个方法调用class方法,打印的都是类对象的isa指针。

NSLog(@"%p,%p,%p",[ViewController classMethod],[ViewController class],[self class]);

反射方法

系统Foundation框架为我们提供了一些方法反射的API,我们可以通过这些API执行将字符串转为SEL等操作。由于OC语音的动态性,这些操作都是发生在运行时的。
// SEL和字符串转换
FOUNDATION_EXPORT NSString *NSStringFromSelector(SEL aSelector);
FOUNDATION_EXPORT SEL NSSelectorFromString(NSString *aSelectorName);
// Class和字符串转换
FOUNDATION_EXPORT NSString *NSStringFromClass(Class aClass);
FOUNDATION_EXPORT Class __nullable NSClassFromString(NSString *aClassName);
// Protocol 和字符串转换
FOUNDATION_EXPORT NSString *NSStringFromProtocol(Protocol *protocol) NS_AVAILABLE(10_5, 2_0);
FOUNDATION_EXPORT Protocol * __nullable NSProtocolFromString(NSString *namestr) NS_AVAILABLE(10_5, 2_0);
通过这些方法,我们可以在运行时选择创建那个实例,并动态选择调用哪个方法。这些操作甚至可以由服务器传回来的参数来控制,我们可以将服务器传回来的类名和方法名,实例为我们的对象。

常用判断方法

在 NSObject 类中为我们提供了一些基础方法,用来做一些判断操作,这些方法都是发生在运行时动态判断的。
// 当前对象是否这个类或其子类的实例
- (BOOL)isKindOfClass:(Class)aClass;
// 当前对象是否是这个类的实例
- (BOOL)isMemberOfClass:(Class)aClass;
// 当前对象是否遵守这个协议
- (BOOL)conformsToProtocol:(Protocol *)aProtocol;
// 当前对象是否实现这个方法
- (BOOL)respondsToSelector:(SEL)aSelector;
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、理解Class对象 (一)RRIT的概念以及Class对象的作用 认识Class对象之前,先来了解一个概念,R...
    守住阳光阅读 6,192评论 0 0
  • 问见的活鲜来自于哪里呢? 问见的活鲜来自国际水产城,水产城布有活、鲜、冻、干四大交易区及加工和配套服务服务区,是舟...
    问见文化传播阅读 861评论 0 0
  • Otc 27 心情 晴 两个邪恶的人儿,在说🍭!
    野心家c阅读 1,450评论 0 1
  • 狗狗如何讨人喜欢 1.热情 2.听话 3.长的好看 猫咪如何讨人喜欢 1.长得好看 2.长得好看 3.长得好看 :)
    木白__阅读 1,198评论 0 0
  • 作为不爱做选择的人,我直接在客户端把电影那一栏按好评度排名,选择了一个名字清奇的作品,第八日的蝉。跟着并不明快的节...
    Elly奇阅读 3,698评论 0 0

友情链接更多精彩内容