黑马程序员——OC的内存管理——MRC

本文详细介绍了Objective-C的MRC(Manual Reference Counting)内存管理机制,包括基本概念、手动开启MRC、内存管理原则、野指针处理、对象作为实例变量的内存管理以及autorelease的使用。通过实例解析了对象生命周期中的retain、release和dealloc操作,强调了正确管理内存以避免内存泄漏的重要性。
摘要由CSDN通过智能技术生成

———-android培训、Java培训、iOS培训,期待与您交流———-

一、基本概念

1. 为什么要进行内存管理?

由于对象存储在内存的堆中,而除了对象之外的其他局部变量存储在栈中,当当前代码块结束时,系统会自动回收存储在栈中的数据,指向对象的指针也会被自动回收。此时没有指针指向对象,而对象依然存在在内存中,会造成内存泄漏。

内存管理

如上图所示,在OC中所要管理的内存,就是存储在堆区的对象实例。

2. OC提供的三种内存管理方式:

  • Mannual Reference Counting(MRC,手动管理,在iOS4.1之前必须使用MRC)
  • Automatic Reference Counting(ARC,自动引用计数,iOS4.1之后推出)
  • Garbage Collection(垃圾回收,iOS不支持,仅在开发Mac app时使用)
    注:开发中尽量使用ARC

3. 关于引用计数(Reference Counting)

每个对象都有一个与之相关联的整数,被称作它的引用计数。当某段代码需要访问一个对象时,这个对象的引用计数就加1。当这段代码结束对象访问时,这个对象的引用计数就减1。当对象的引用计数为0时,就表示不再有代码访问该对象了,因此他将被删除,所占用的内存会被系统回收。

创建一个新的对象时(包括使用alloc、new和copy),该对象的引用计数被设置为1。使用retain(返回值为当前对象)方法可以使引用计数加1,使用release(返回值为空)则可以使引用计数减1,使用retainCount可以获得对象当前的引用计数值(返回值的类型为NSUInteger)。

当一个对象的引用计数为0时,会自动调用dealloc方法,这样,该对象就能被从内存中释放掉。

二、手动内存管理(MRC)

1. 开启MRC

由于目前的OC项目默认是关闭MRC的,所以需要手动开启。具体方法如下:
选中项目 -> Build Setting -> Basic -> levels -> 搜索auto -> 把ARC改为NO。

2. 基本应用举例

假设已经有对象Car。在main.m中:

#import <Foundation/Foundation.h>
#import "Car.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Car *c = [Car new];
        NSUInteger count 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值