美文网首页
实例对象,类对象,元类对象的存储

实例对象,类对象,元类对象的存储

作者: jemmy_xl | 来源:发表于2020-03-23 16:46 被阅读0次
    image.png

    int a = 10;
    sizeof(a) -> 4byte。 sizeof是运算符,在编译的时候通过类型计算大小。 int 是4byte所以是4
    Person *p = [Person new];
    sizeof(p) -> 8byte .指针是8byte。

    image.png

    isa 与 superClass 的调用关系。

    image.png

    重点:


    image.png

    如上面图片, Mjstudent 调用类方法 abc。如果 Mjstudent元类对象没有类方法abc。就通过superClass找到MJPerson 寻找类方法abc,如果没有,再通过NSObject 寻找类方法abc,如果没有。这时候就很奇怪了。NSObject 元类会调用superClass到类方法查找 实例方法 abc,有的话,执行实例方法abc,没有的话,NSObject的类方法调用superClass(未 nil)找abc。这时候Xcode就会报错,没有找到该方法。

    image.png image.png

    p (IMP) 实例对象 。 打印出方法实现。

    KVO:


    image.png

    这样写可以触发KVO


    image.png image.png

    KVC:
    1.取值原理


    image.png image.png

    Category:


    block


    image.png image.png

    // 强指针指着


    image.png image.png

    多线程

    image.png

    GCD

    下图会发生死锁


    image.png

    解释: block1 与block2在同一个串行队列(如何是并发对象就不会死锁)中。block2是同步要立马执行,但是block1还没有执行完毕,所以执行不了。

    // 下图不会发生


    image.png

    解释:
    block1 与 block2不在同一个队列中。就不需要考虑等前一个任务完成才执行下一个任务。所以不存在相互等待。

    打印如下 注意线程都是在同一条中完成的


    image.png

    // 多种方式打印


    image.png image.png

    解释:打印 1 后就崩溃了,因为 start的时候,就去执行 Nslog(@"1");的任务。block执行完成后,线程就退出了。performSlector 然后再次调用 thread的线程,线程生命周期结束了,所以崩溃了

    image.png

    修改(不会崩溃):线程中添加runLoop这样线程执行完block的话线程处于休眠状态,performSlector的时候会唤醒runLoop然后执行。

    相关文章

      网友评论

          本文标题:实例对象,类对象,元类对象的存储

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