iOS ARC完全指南

本文详细介绍了iOS中的自动引用计数(ARC)机制,包括内存管理的思考方式、引用计数、ARC的实现规则,以及如何在ARC环境下进行内存管理。通过了解ARC,开发者可以更有效地管理Objective-C对象的生命周期,减少内存泄漏和程序崩溃的风险。
摘要由CSDN通过智能技术生成

什么是自动引用计数

自动引用计数(ARC, Automatic Reference Counting)是指内存管理中对引用采用自动计数的技术

ARC苹果官方说明

在Objective-C采用Automatic Reference Counting (ARC)机制,让编译器来进行内存管理。在新一代Apple LLVM编译器中设置ARC为有效状态,就无需再次键入retain或者release代码,这在降低程序崩溃、内存泄漏等风险的同时,很大程度上减少了开发程序的工作量。编译器完全清楚目标对象,并能立刻释放那些不再被使用的对象。如此一来,应用程序将具有可预测性,且能流畅运行,速度也将大幅提升。

其中关键是

  • 使用Xcode 4.2以上版本
  • 使用LLVM编译器3.0或以上版本
  • 编译器选项中设置ARC为有效

在以上条件编译源代码时,编译器将自动进行引用计数
那么先了解一下在此之前程序猿在代码是如何手动进行内存管理的

内存管理/引用计数

内存管理的思考方式

看到"引用计数"这个名称,会不自觉将注意力放在"计数"上,但其实客观正确的思考方式时:

  • 自己生成的对象自己持有
  • 非自己生成的对象自己也可以持有
  • 不再需要自己持有的对象时释放

各个词表示的Objective-C方法如下

对象操作 Objective-C方法
生成并持有对象 alloc/new/copy/mutableCopy等方法
持有对象 retain方法
释放对象 release方法
废弃对象 dealloc方法

接下来详细了解"内存管理的思考方式"中出现的各个项目

自己生成的对象,自己持有
使用以下名称开头的方法名意味着自己生成的对象只有自己持有:

  • alloc
  • new
  • copy
  • mutableCopy
id obj = [[NSObject alloc] init];

使用NSObject类的alloc类方法就能自己生成并持有对象。指向生成并持有对象的指针被赋给变量obj。另外,[NSObject new][[NSObject alloc] init]是完全一致的。

copy方法利用基于NSCopying方法约定,又各类实现的copyWithZone:方法生成并持有对象的副本。mutableCopy方法与copy方法类似。两者的区别在于,copy方法生成不可变更的对象,而mutableCopy方法生成可变更的对象。这类似于NSArray类对象与NSMutableCopy类对象的差异。用这些方法生成的对象,虽然是对象的副本,但同alloc、new方法一样,在"自己生成并持有对象"这点上没有改变。

下列名称也意味着自己生成并持有对象

  • allocMyObject
  • newThatObject
  • copyThis
  • mutableCopyYourObject

非自己生成的对象,自己也能持有

使用NSMutableArray类的array类方法

id obj = [NSMutableArray array];

NSMutableArray类对象被赋给变量obj,但变量自己不持有该对象,使用retain方法可以持有对象

[obj retain];

通过retain方法,非自己生成的对象成为了自己所持有的

不再需要自己持有的对象时释放

自己持有的对象一旦不再需要,持有者有义务释放该对象。释放使用release方法

id obj = [[NSObject] init]; //自己生成并持有对象

[obj release]; //释放对象

如此,使用alloc方法自己生成并持有的对象就释放了。自己生成而非自己所持有的对象,若用retain方法变为自己持有,也同样可以用release方法释放。

无法释放非自己持有的对象

// 1. 释放一个已经释放的对象
    id obj = [[NSObject alloc] init];

    // 已经释放对象
    [obj release];

    // 释放了对象还进行释放
    [obj release];


    // 2. 释放一个不属于自己的对象
    id obj1 = [obj object]; 

    // obj1没有进行retain操作而进行release操作,使得obj持有对象释放,造成了野指针错误
    [obj1 release];

引用计数器讨论

苹果对于引用计数的管理是通过一张引用计数表进行管理的
在这里插入图片描述
我们平常在操作对象的引用计数器时,其实就是对这个引用计数表进行操作,在获取到该表的地址以及相应对象的内存地址,就可以通过对象的内存从该表中进行索引获取到相应的引用计数值,然后根据用户的操作来返回计时器、计时器加1、计时器减1,下面就深入讨论retain、release、alloc、dealloc具体怎么操作该引用计数表

alloc

当我们调用alloc函数时我们进一步会调用allocWithZone方法

    id obj = [[NSObject alloc] init];


    + (id)alloc {
   
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

waxuuuu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值