Objective-C 内存管理

本文详细介绍了Objective-C的内存管理,包括alloc与release、引用计数、setter方法、自动释放池、垃圾回收以及内存管理的基本原则。重点讲解了对象生命周期中的retain、release、autorelease和dealloc操作,以及如何避免内存泄露。
摘要由CSDN通过智能技术生成
C语言使用malloc方法申请内存,使用free释放内存。

Objective-c使用alloc方法申请内存,使用Release来释放它。


一、内存申请(alloc)
    当使用alloc创建一个对象时,需要在用完之个对象后释放(Release)它。
    比如:

//str1会自动释放,我们不需要自己去释放
NSString* str1 = [NSString string];

//str2需要手工释放
NSString* str2 = [[NSString alloc] init];
...
[str release];  //用release释放str2的内存


二、释放内存(dealloc)
    当一个对象从内存上删除之前,系统就会自动调用dealloc方法,释放内存。
    比如:

-(void)dealloc {
  [name release];
  [var release];
  [super dealloc];  //这一句一定不要少了
}

dealloc是由系统自动调用的,我们永远都不要自己主动去调用dealloc来释放内存。
不过,我们可以像上面那样重载dealloc方法,来释放自己的内存及清理的相关工作。
在垃圾回收机制下,dealloc不会被调用到。


三、引用记数(retainCount)

整个Objective-c中都使用对象引用,而且每个对象有一个引用计数器retainCount
当使用alloc(或者copy)方法创建一个对象时,其计数器的值增加1。
调用retain方法增加1,调用release方法就减少1。当计数器为0时,系统自动调用dealloc方法来释放内存中的对象。
如:

NSString* str = [[NSString alloc] init];  //执行后,retainCount的值为1
[str retain];  //执行后,retainCount的值为2
[str release]; //执行后,retainCount的值为1
[str release]; //执行后,retainCount的值为0

四、类成员变量

在大多数情况下,一个成员变量的setter方法应该仅仅autorelease/release旧对象,然后retain/copy新的对象,我们只需要在dealloc的时候调用release就可以了
所以真正需要做的就是管理方法内部的局部变量的引用。如:

-(void)setName:(NSString*)newName {
  if(name != newName ) {
     [name release];
     name = [newName copy];  // name的retainCount为1
  }
}
下面是使用retain管理成员变量的另外一个例子:

-(void)setName:(NSString*)newName {
  [name autorelease];
  name = [newName retain];  // name的retainCount为1
}

-(void) dealloc {
  [name release];
  [super dealloc];
}


在上面的dealloc函数,如果写成下面的形式也是可以的:


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值