关于理解内存管理

关于理解内存管理

前言:最近一段时间比较有空,看到自己的blog很久没有更新了,所以记录下今天所学,不好的地方请大家多多指出,我会尽力改善。

1、什么是引用计数(ReferenceCount)
简单而有效的管理对象生命周期的方式。不管是oc还是swift,内存管理的方式都是基于引用计数来管理的。

2、引用计数是如何工作的
首先先让我们来说明下,以前的工程使用的时候是mrc,现在xcode新建之后肯定是arc的,那我们可以通过工程配置来修改这里写图片描述

或者是给类添加 -fno-objc-arc编译参数来修改启动手工管理引用计数的模式。
让我们来看下下面的代码:

    NSLog(@"reference count = %u",[object retainCount]);
    NSObject *another = [object retain];
    NSLog(@"reference count = %u",[object retainCount]);
    [another release];
    NSLog(@"reference count = %u",[object retainCount]);
    [object release];

运行的结果如下:
这里写图片描述

当我们创建一个新对象的时候,这个对象的引用计数会加1,当有一个新的指针指向这个对象的时候,会将其引用计数加1,当不指向这个指针是,其引用计数会减1,当引用计数释放时,计数会为0,那么对象会给销毁,回收内存,那么问题来了!我们在工程打印出来是为什么会是1呢?

在巧神的书上看到的解释是:其实引用计数的管理方式和linux文件系统里面的硬链接一样,当你释放的时候,系统就知道要马上回收这个内存了,没有必要在retainCount –1 ,不管减不减1,该对象肯定会被回收,然而对象被回收后,它的所有内存区域,包括retainCount值也变的没有意义了,不把1变为0可以减少一次内存操作,加快对象的回收。

3、使用管理内存的的原则
谁申请有谁释放

4、如果旧项目会引出循环引用问题,我们可以用xcode自带的Leaks来进行检查,如下图所示:这个是我测试循环引用的截图
首先:这里写图片描述
然后选择:
这里写图片描述
下面运行后红色的线就是循环引用问题:
这里写图片描述
具体我们可以看到在那个类的方法上出现了循环引用
这里写图片描述

说了那么内存计数,那么苹果已经给出arc给开发者,这个其实有很多好处的,可以让我们更多的去关注逻辑等功能实现,而不必要去担心内存泄露问题,不过在使用arc的时候要避免盲目的依赖,另外在ios4.3要注意的是要把weak换成__unsafe_unretained,对于遇到Core Foundation对象是需要自己去手工管理他们的引用计数的。

5、CoreFoundation对象的内存管理

底层的CoreFoundation对象,大多数是以XxxCreateWithXxx这样的方式创建的,例如:

CFStringRef str = CFStringCreateWithCString(kCFAllocatorDefault, "hahah", kCFStringEncodingUTF8);
    CTFontRef fontRef = CTFontCreateWithName((CFStringRef)@"ArialMT", 14.0f, NULL);

这些对象的引用计数修改要相应的使用CFRetain 和 CFRelease 方法

CFRetain(str);
CFRelease(str);

这两个的使用和retain和release一样。

在使用的过程中,需要将一个CoreFoundation对象转换为一个OC对象,
* __bridge: 只做类型转换,不修改相关对象的引用计数,原来的CoreFoundation对象在不用时,需要调用CFRelease。
* __bridge_retained:类型转换后,将该对象引用计数加1,原来的CoreFoundation对象在不用时,需要调用CFRelease。
* __bridge_transfer:类型转换后,将该对象的引用计数交给arc管理,CoreFoundation对象在不用时,不需要调用CFRelease。

以上是学习到的知识点整理,如有不对,请广大朋友指点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值