1 概念 oc采用 引用计数器的方式来 管理内存;
每个oc对象都有自己的引用计数器,对象创建后,计数器默认值为1. 当对象被其他对象引用时,计数+1, 如果对象没有被其他对象引用 计数=0, 对象被释放, 对象所在的内存空间被回收,
2 release retain autorelease
release | 对象计数-1
retain | 对象计数+1
autorelease | 对象被放置在自动释放池,计数+1
3 自动释放池
oc内存管理怎么能不提到autoreleasepool,,auoreleasepool本质上是以栈为节点的双链路数据结构。
当对一对象[object autorelease] 后, 会将对象放在一个autoreleasepool中,从而 对象进行一次引用,计数+1;当autoreleasepool 释放时,会对所持有的对象做一次release 即计数-1。 arc 下, 创建的局部变量, 参数返回值一般都放在自动释放池中. 其中参数返回值 需要注意, 当定义一个函数后,函数的返回值会放在一个临时内存区 只有外部对象 指向此函数数 ,该函数返回值才会真正放在自动释放池中
-(NSString*)uppercaseStr:(NSString*)orginStr{
NSString *str = [[NSString alloc]initWithString:orginStr.uppercaseString];
return str;
}
复制代码
此时str并没有被放在自动释放池,只有当外部有对象引用uppercaseStr方法时,才会放入。
4 week strong
arc 下是不允许调用release,retain,retainCount;
person *a =[ [person allloc]init]
person *otherA = a; // 当前对象内指针引用,计数不变
OtherObject.person= a; // 其他对象引用,计数+1
__week Person *weekA = a;
复制代码
arc下 OtherObject对a 进行强引用 即strong 强指针, 相当于原来mrc的retain,计数+1; c是a弱引用 即弱指针,本质上 对a的引用计数没有影响,
Car *car = [[Car alloc]init];
__weak Car *otherCar = car;
NSLog(@"weekCar retainCount:%lu",[car retainCount]);
[car release];`
复制代码
Week变量 存在在一个独立的hashMap里,以a的指针地址为key, value则是week变量数组,week变量不会影响引用的变量计数