zoukankan      html  css  js  c++  java
  • iOS 调用对象的方法发生了什么?

    iOS 调用对象的方法发生了什么?

    1、先根据对象的 isa 指针找到该对象的类对象,即该对象所属的类;

    2、在该类对象的缓存方法列表里面查找该方法,找到即执行响应方法;

    3、如果没找到,向该类对象的方法列表里面查找该方法,找到即执行响应方法;

    4、如果没找到,根据该类对象的父对象指针,去父对象里去执行2、3步骤;

    5、如果没找到,转向拦截调用,走消息转发机制;

    消息转发机制:

    1、是否动态的去添加这个方法去处理:+(BOOL)resolveInstanceMethod:(SEL)sel或者+(BOOL)resolveClassMethod:(SEL)sel 。返回值为No时,进入第二步;

    2、转发给其他对象,是否能实现这个方法:- (id)forwardingTargetForSelector:(SEL)aSelector 。返回值为nil时,进入下一步;

    3、返回一个方法签名:- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector 。

      方法签名返回正确的话,执行 - (void)forwardInvocation:(NSInvocation *)anInvocation ,这个方法可以转发到多个对象中;

    4、再没找到就会crash

    如果找到了:

    在方法中找到IMP指针,执行具体实现。

    向一个nil对象发送消息将会发生什么?

    如果向一个nil对象发送消息,首先在寻找对象的isa指针时就是0地址返回了,所以不会出现任何错误。也不会崩溃。

  • 相关阅读:
    1740-约数之和
    1653-南邮的面积
    1880-A. 偷吃可耻
    1429-全排列的输出
    1342-皇后控制问题
    1340-逆矩阵问题
    1319-n皇后问题
    1221-最少硬币问题
    1219-整数因子分解问题
    linux 命令小结
  • 原文地址:https://www.cnblogs.com/shen5214444887/p/12345907.html
Copyright © 2011-2022 走看看