Objective-C提供了三种内存管理方式:
MannulReference Counting(MRC,手动管理,在开发 iOS4.1之前的版本的项目时我们要自己负责使用引用计数来管理内存,比如要手 动 retain、release、autorelease 等,而在其后的版本可以使用 ARC,让系统自己管理内存。)
automatic reference counting(ARC,自动引用计数,iOS5 之后推出的)
garbage collection(垃圾回收)。iOS不支持垃圾回收; ARC作为苹果新提供的技术,苹果推荐开发者使用ARC技术来管理内存;
1)引用计数器:
1.每个OC对象都有自己的引用计数器,对象刚被创建时,默认计数器值为1,当计数器的值变为0时,则对象回收(调用dealloc)。
Objective - c计数器的方法
- (NSUInteger)retainCountOBJC_ARC_UNAVAILABLE;2.对引用计数器的操作
给对象发送消息,进行相应的计数器操作。
retain
消息:使计数器+1,该方法返回对象本身语法:
[对象名 retain]
release
消息:使计数器-1(并不代表释放对象)语法:
[对象名 release]
retainCount
消息:获得对象当前的引用计数器值 %lu(计数器为 unsignedlong 类型 占8个字节)#import <Foundation/Foundation.h>
@interface Temp : NSObject
@end
@implementation Temp
@end
int main(int argc,constchar * argv[]) {
Temp * temp = [Tempnew];//引用计数器默认为1,
[temp retain];//让引用计数器+1,所以为2
[temp release];//让引用计数器-1,对应了retain
[temp release];//让引用计数器-1 默认值为1,-1释放
//引用计数器为0时释放
return0;
}
2)内存管理的原则
1.原则:
只要还有人在使用某个对象,那么这个对象就不会被回收; 只要你想使用这个对象,那么就应该让这个对象的引用计数器+1; 当你不想使用这个对象时,应该让对象的引用计数器-1;
2.谁创建,谁release:
(1)如果你通过alloc,new,copy来创建了一个对象,那么你就必须调用release或者 autorelease方法
(2)不是你创建的就不用你去负责
3.谁retain,谁release
只要你调用了retain,无论这个对象时如何生成的,你都要调用release
4.总结
有始有终,有加就应该有减。曾经让某个对象计数器加1,就应该让其在最后-1.
3)dealloc方法
1.dealloc方法只有在计数器为0的时候被调用
2.dealloc方法继承自NSObject(继承链接)
3.dealloc方法作用是用来释放对象
我们可以在跟据dealloc方法是否被调用得知一个对象是不是被释放了。
永远不要直接通过对象调用dealloc方法(实际上调用可能并不会出错)
一旦对象被回收了, 它占用的内存就不再可用, 坚持使用会导致程序崩溃(野指针错误)为 了防止调用出错,可以将“野指针”指向nil(0)。
重写dealloc方法
要引用父类的deallo,而且要放到最后,因为创建的每个类都是从父类,根类继承来的,有很多实例变量也会继承过来,它们不会自动释放内存,需要调用父类的dealloc方法来释放,在此之前需要把当前类中的变量内存先释放掉,否则会造成当前本类中的内存积压,造成泄漏
#import <Foundation/Foundation.h>
@interface Temp : NSObject
@end
@implementation Temp
-(void)dealloc
{
//成功释放时会输出
NSLog(@"已经释放");
//引用父类的dealloc
[super dealloc];
}
@end
int main(int argc,constchar * argv[]) {
Temp * temp = [Tempnew];
[temp release];//让引用计数器-1
//引用计数器为0时释放
return 0;
}