实例对象,类对象,元类对象的存储
int a = 10;
sizeof(a) -> 4byte。 sizeof是运算符,在编译的时候通过类型计算大小。 int 是4byte所以是4
Person *p = [Person new];
sizeof(p) -> 8byte .指针是8byte。
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.pngp (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.pngGCD
下图会发生死锁
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然后执行。