实例对象,类对象,元类对象的存储
![](https://img.haomeiwen.com/i432303/7da5928aba540fe1.png)
int a = 10;
sizeof(a) -> 4byte。 sizeof是运算符,在编译的时候通过类型计算大小。 int 是4byte所以是4
Person *p = [Person new];
sizeof(p) -> 8byte .指针是8byte。
![](https://img.haomeiwen.com/i432303/9b36f8a06be56950.png)
isa 与 superClass 的调用关系。
![](https://img.haomeiwen.com/i432303/bcb10c6a561a70e0.png)
重点:
![](https://img.haomeiwen.com/i432303/29a852aace577368.png)
如上面图片, Mjstudent 调用类方法 abc。如果 Mjstudent元类对象没有类方法abc。就通过superClass找到MJPerson 寻找类方法abc,如果没有,再通过NSObject 寻找类方法abc,如果没有。这时候就很奇怪了。NSObject 元类会调用superClass到类方法查找 实例方法 abc,有的话,执行实例方法abc,没有的话,NSObject的类方法调用superClass(未 nil)找abc。这时候Xcode就会报错,没有找到该方法。
![](https://img.haomeiwen.com/i432303/a741db93af33b8bc.png)
![](https://img.haomeiwen.com/i432303/ac60bdfd98f7a4b6.png)
p (IMP) 实例对象 。 打印出方法实现。
KVO:
![](https://img.haomeiwen.com/i432303/7d80f1919e9e733b.png)
这样写可以触发KVO
![](https://img.haomeiwen.com/i432303/13746c0b66b9a251.png)
![](https://img.haomeiwen.com/i432303/62dbe53b1b3aa154.png)
KVC:
1.取值原理
![](https://img.haomeiwen.com/i432303/d3b0c2e8ee7904b8.png)
![](https://img.haomeiwen.com/i432303/0df56d4fef1b16ee.png)
Category:
![](https://img.haomeiwen.com/i432303/dca620d86a25e3de.png)
block
![](https://img.haomeiwen.com/i432303/31648e098e915455.png)
![](https://img.haomeiwen.com/i432303/25eb757445d95dd3.png)
// 强指针指着
![](https://img.haomeiwen.com/i432303/6bcb9ebb9dc7d804.png)
![](https://img.haomeiwen.com/i432303/861b7e7f4c358345.png)
多线程
![](https://img.haomeiwen.com/i432303/cfa6b5e48b99d765.png)
GCD
下图会发生死锁
![](https://img.haomeiwen.com/i432303/53316c97eeb7cf42.png)
解释: block1 与block2在同一个串行队列(如何是并发对象就不会死锁)中。block2是同步要立马执行,但是block1还没有执行完毕,所以执行不了。
// 下图不会发生
![](https://img.haomeiwen.com/i432303/e9e64e3e17e0ee88.png)
解释:
block1 与 block2不在同一个队列中。就不需要考虑等前一个任务完成才执行下一个任务。所以不存在相互等待。
打印如下 注意线程都是在同一条中完成的
![](https://img.haomeiwen.com/i432303/21db54064758dcf1.png)
// 多种方式打印
![](https://img.haomeiwen.com/i432303/eef6b2d34cb7ba44.png)
![](https://img.haomeiwen.com/i432303/4cd75881a1265782.png)
解释:打印 1 后就崩溃了,因为 start的时候,就去执行 Nslog(@"1");的任务。block执行完成后,线程就退出了。performSlector 然后再次调用 thread的线程,线程生命周期结束了,所以崩溃了
![](https://img.haomeiwen.com/i432303/d2a6efd8ca3420f9.png)
修改(不会崩溃):线程中添加runLoop这样线程执行完block的话线程处于休眠状态,performSlector的时候会唤醒runLoop然后执行。