栈区由系统自动分配和释放 存放局部变量的值等
堆区一般是由程序员分配和释放,如果不释放会出现内存泄露.程序退出时系统会会收你的内存.
特点是 无序速度慢 容量大
静态存储区 全局变量和静态变量都存放在静态区域,当程序结束时系统回收
常量区 存放常量的内存区域 程序结束时 系统回收
代码区 存放二进制代码的区域
循环引用 对象A retain对象B, 同时对象 B retain 对象A,这种情况称为循环引用
循环引用会导致两个对象都无法销毁 因此循环引用时 一般一端用 retain 一端用 assign
自动释放池是 OC 的一种内存管理机制 当自动释放池销毁时,它会对池子中的每一个对象调用一次release 方法
代理和 block 都会导致循环引用,导致对象的引用计数管理器值不能为0,内存也就导致无法释放
所以声明一个 delegate 属性都会写成 assign,block 则用__ weak 来解决循环引用问题,循环引用导致的内存无法释放就是内存泄露问题,
野指针错误是指一个指针指向一个已经释放了的或者不可用内存地址,OC 中都是利用指针访问对象的,在栈上有一个指针变量,该指针变量的内容就是堆空间上的那个对象的内存地址,也就是说由栈上的那个指针指向了堆上的对象..所以 OC 都是应用这种方式来访问对象的,内存过早的释放就造成野指针错误,内存无法释放就造成内存泄露.其实对象就是一个结构体实例,首地址是个 isa 指针,指向它所属的类,对象分配内存主要是存储一些属性,初始化的时候给这些属性赋予一些合理值,然后对象可以通过前面提到的 isa 指针从类中获取对象方法,这也就是 OC 的消息机制,调用某个对象的某个方法称为给某个对象发送了一个消息,消息机制的底层实现是一个 runtime 库,他是由 C语言封装的,给对象发送一个消息通过 isa指针从该对象的类中通过 SEL方法选择器找到对应的方法,然后根据 sel找到对应的 IMP也就是方法的实现,这样就完成了一个方法的调用