C语言使用malloc方法申请内存,使用free释放内存。
二、释放内存(dealloc)
当一个对象从内存上删除之前,系统就会自动调用dealloc方法,释放内存。
比如:
dealloc是由系统自动调用的,我们永远都不要自己主动去调用dealloc来释放内存。
不过,我们可以像上面那样重载dealloc方法,来释放自己的内存及清理的相关工作。
在垃圾回收机制下,dealloc不会被调用到。
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函数,如果写成下面的形式也是可以的: