iOS面试总结系列 --内存管理

本文深入探讨了Objective-C中的内存管理机制,包括引用计数、autorelease池的工作原理,以及ARC环境下weak和strong引用的区别。

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];`
复制代码

此时 car内存计数不变

Week变量 存在在一个独立的hashMap里,以a的指针地址为key, value则是week变量数组,week变量不会影响引用的变量计数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值