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

2020-03-23  本文已影响0人  jemmy_xl
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然后执行。

上一篇下一篇

猜你喜欢

热点阅读