iOS内存管理规则

引用计数

Objective-C语言使用引用计数来管理内存,也就是说,每个对象都有个可以递增或递减的计数器。如果想使某个对象继续存活,那就递增其引用计数;用完之后,就递减其计数。计数变为0时,就表示没有人在继续关注该对象了,于是就可以把它销毁。(iOS从未支持过垃圾回收机制

内存管理原则

  • 自己生成的对象,自己持有(alloc/new/copy/mutableCopy)
  • 非自己生成的对象,自己也能持有(retain)
  • 不在需要自己持有的对象时释放(release)
  • 非自己持有的对象不能释放
自己生成的对象,自己持有

使用alloc、new、copy、mutableCopy开头的方法名,意味着自己生成的对象自己持有。

id obj = [[NSObject alloc] init];
id obj = [NSObject new];
复制代码
非自己生成的对象,自己也能持有

使用上面方法之外的方法取得的对象,为非自己生成的对象,所以自己也不是该对象的持有者。可以使用retain方法持有非自己生成的对象。

id obj = [NSMutableArray array]; // 取得的对象存在,但自己不持有对象
[obj retain]; // 自己持有对象
复制代码
不在需要自己持有的对象时释放

自己持有的对象,不在需要时,持有者有义务释放该对象。使用release方法释放对象。当对象的引用计数为0时,则该对象被销毁(dealloc)。

id obj = [[NSObject alloc] init];
[obj release];

id obj = [NSMutableArray array];
[obj retain];
[obj release];
复制代码

注意:对象被释放后,不可再被访问

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

在应用程序中,释放非自己持有的对象会造成崩溃。

id obj = [[NSObject alloc] init];
[obj release];
[obj release];

id obj = [NSMutableArray array];
[obj release]

//这两种情况都是释放了非自己持有的对象,都会导致应用程序崩溃
复制代码

这些关于Objective-C的内存管理方法,实际上不包括在该语言中,而是包含在Cocoa框架中。Cocoa框架中的Foundation框架中的NSObject类担负了内存管理职责。上述提到的alloc/retain/release/dealloc等方法都是NSObject类提供的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值