每个对象都有一个引用计数器(4字节)
1.引用计数为0的时候对象就会被销毁(内存被回收),不为0就不会被销毁,除非程序退出
2.对象刚创建的时候引用计数为1
引用计数器的数值怎么计算
1.创建对象时候默认就是1(alloc, new, copy)
2.给对象发送一条retain消息 加1
3.给对象发送一条release消息 减1
4.给对象发送一条retainCount消息 获取计数器的数值
对象销毁
销毁的前提:引用计数器为0
销毁时做的事情:调用dealloc方法
(一定要调用[super dealloc])
当对象不存在时不可以再relese 和retain
指向不可以内存的指针:野指针错误
非ARC环境下 [super dealloc]必须写
多个对象使用同一个对象,这个对象的引用计数是由这多个对象来控制的,谁使用谁加一,谁不使用谁减一
setDog中
_dog = [dog retain];
内存管理就是确保开辟的堆空间被正确的释放
黄金法则
1.凡是用alloc, retain, new (或使用new开头的方法),copy(或使用copy开头的方法),NSMutableCopy (或使用NSMutableCopy开头的方法)创建的对象都必须使用release或autorelease方法释放。
2.谁创建谁释放(哪个类创建,哪个类释放,谁写alloc,谁写release)
if(_crayFish != crayFish){
[_crayFish release]; = @property (retain) CrayFisn *crayFish
}
_crayFish = [crayFish retain];
非ARC环境下 dealloc要自己手动释放
retain 对象,assign非对象
@property(nonatomic,retain) NSString *str;
浅拷贝:拷贝指针
深拷贝:对象拷贝
retain只是计数器加一,还是同一个对象
copy拷贝的对象不可以被修改
NSMutablecopy拷贝的对象可以背修改
MRC对象的释放看当前对象的引用计数
ARC对象的释放看当前对象有被强引用
__weak弱指针 虽然引用 但是不指向 销毁对象时不考虑弱指针
相互调用时必须有一个是弱引用