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地址返回了,所以不会出现任何错误。也不会崩溃。

  • 相关阅读:
    Cheatsheet: 2012 03.23 ~ 03.31
    Cheatsheet: 2012 04.13 ~ 04.24
    Cheatsheet: 2012 02.09 ~ 02.29
    Cheatsheet: 2012 03.01 ~ 03.12
    Cheatsheet: 2012 03.13 ~ 03.22
    Cheatsheet: 2012 01.20 ~ 01.31
    Cheatsheet: 2012 04.01 ~ 04.12
    Cheatsheet: 2012 04.25 ~ 05.03
    Cheatsheet: 2012 01.10 ~ 01.19
    1.30
  • 原文地址:https://www.cnblogs.com/shen5214444887/p/12345907.html
Copyright © 2011-2022 走看看