通过字面的方式创建出来的对象保存在常量区,通过对象方法和类方法创建出来的对象保存在堆区
内存有系统管理,局部变量保存在栈,当变量离开其所在代码快就会被回收
堆内存
需要程序员自己管理,oc中的对象保存在堆中
内存管理不当会造成的两个问题
内存泄露,不再需要的对象没有释放,导致内存泄露,内存泄露会造成程序闪退
野指针,正在使用的对象被释放了,导致野指针,野指针会导致程序奔溃
MRC 手动内存管理
引用计数
每一个对象都有一个引用计数
当对象出生的时候引用计数器为1
当调用对象的release消息的时候,计数器-1
当一个对象的引用计数为0的时候,这个对象立即被回收
内存管理原则
当给一个对象发送alloc new copy retain消息的时候,就必须在适当的时候发送release或者autorelease消息
当你需要一个对象的时候就给这个对象的引用器+1,当你不需要这个对象的时候,就需要将对象计数器-1
多个对象管理
setter方法
当设置新对象的时候需要做一次retain操作
当原来的对象不需要了,需要对原来的对象做一次release操作
如果是同一个对象,就不需要retain和release操作
当对象消失前,会释放成员所占有的内存
在释放内存之前首先要调用【super dealloc】
当两个或多个对象引用构成一个封闭的环就是循环引用
循环引用导致环中的对象释放不了
解决循环引用,有一端必须是assign的
@property的使用
基本数据类型使用assign
普通对象使用retain
NSString及block使用copy
权限控制readonly只能生成getter方法,readwrite可读可写生成getter和setter方法
线程安全atomic,会给setter方法加锁,访问速度比较慢
noatomic非线程安全,不会给setter方法加锁,访问速度比较快
使用自动释放池延迟对象的释放,原理 自动释放池栈
当你调用autorelease时,该对象会自动加入到自动释放池中
当执行到自动池后面的大括号时候,自动释放池会出栈,此时栈中的对象做一次release操作
你使用几次autorealse,当自动释放池被销毁的时候就会调用几次release
优点,你不必时刻关注对象,让对象的管理简单
缺点对象不能及时释放,如果占有内存很大,会导致你的程序闪退
当一个对象很小,使用次数很少的时候,可以使用自动释放,快速构造方法,其他需要延迟生命周期的地方
自动引用计数,他是编译器特性,不是运行时特性,编译器会在适当的时候插入内存管理的代码
强指针,默认所有的指针都是强指针,只要强指针指向这个对象,这个对象就不会销毁,只要没有strong指向这个对象的时候,这个对象的引用计数为0的时候,这个对象就会被释放
弱指针 不影响对象的销毁,关键词__weak
循环引用 当多个对象间的引用形成一个环的时候就是循环引用,环中所有对象都释放不了
只有当出现循环引用的时候一端必须是weak
assign不参与内存管理,用于基本数据类型
自动释放池
通过类方法创建出来的对象都在离他最近的池中
只有自动释放池销毁的时候,才会释放池中的对象