------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
今天我们来看看OC语法中另外一个重要的知识点:OC内存管理
OC内存管理的范围:任何继承了NSObject的对象,对基本数据类型无效
它的原理:
1、每个对象内部都保存了一个与之相关联的整数,称为引用计数器。
2、当使用alloc、new、或者copy创建一个对象时,对象的引用计数器被设置为1
3、给对象发送一条retain消息,可以使引用计数器值+1
4、给对象发送一条release消息,可以使引用计数器值-1;
5、当一个对象的引用计数器值为0时,那么它将被销毁,其占用的内存被系统回收,系统也会自动向对象发送一条dealloc消息。一般会重写dealloc方法,在这里释放相关资源。一定不要直接调用dealloc方法
6、可以给对象发送retainCount消息获得当前的引用计数器值。
内存管理原则:
1、谁创建、谁释放,如果你通过alloc、new或copy来创建一个对象,那么你必须调用release或autorelease.换句话,不是你创建的,就不用你去释放。
2、一般来说,除了alloc、new或copy之外的方法创建的对象都被声了autorelease
3、谁retain,谁release。只要你调用了retain,无论这个对象如何生成的,你都要调用release.
retain点语法
OC内存管理正常情况要使用大量的retain和release操作;
点语言可以减少使用retain和release的操作。
编译器对于retain展开形式:
@property (retain)Dog *dog;
展开为:-(void) setDog:(Dog *)aDog;
-(Dog *)dog;
@synthesize dog = _dog; //(retain属性)
展开为:-(void) setDog:(Dog *)aDog{
if(_dog != aDog){
[_dog release];
_dog = [aDog retain];
}
};
-(Dog *)dog{
return _dog;
};
copy属性:copy属性是完全把对象重新拷贝一份,计数器重新设置为1,和之前拷贝的数据完全脱离关系
OC的内存管理,归根结底要记住一条黄金法则:谁创建谁释放,谁retain谁释放。