黑马程序员_OC基础06_内存管理小结

---------------------------------------- android培训java培训、期待与您交流! -------------------------------------------


一、内存管理的原因:

OC和Java的一个不同之处在于OC没有垃圾回收机制,所以就要求程序员手动将不再使用的对象释放,否则会照成内存泄露。
只有OC对象才需要释放,C语言基本数据类型不需要释放。


二、内存管理的原则(非常重点、掌握!!):
1、每一个OC对象都有一个引用计数器retainCount,表示对象被引用次数。对象被创建时计数器默认为1,当计数器为0时,系
统会自动调用dealloc方法销毁对象并释放内存。
2、对象的retain方法会使对象计数器+1,release会使对象计数器-1。
3、调用了alloc、new、copy、retain方法,对应的在代码末尾调用一次release。

也就是说调用了alloc、new、copy创建对象,就需要release。谁retain,谁release。

如:

Dog *dog = [[Dog alloc]init];//此时引用计数为1
NSLog(@"  %d",[dog retainCount]); 
[dog retain];//引用计数变成2  
[dog release];//引用计数变成1 
[dog release];//引用计数变成0,系统会自动调用dealloc方法,销毁对象,回收内存


三、内存管理的黄金法则:(官方文档原文)
The basic rule to apply is everything that increases the reference counter with alloc, [mutable]copy

[withZone:] or retain is in charge of the corresponding [auto]release.
如果对一个对象使用了alloc、[mutable]copy、retain,那么你必须使用相应的release或者autorelease。


关于autorelease(自动释放池):
cocoa中的自动释放池(Autorelease pool),是能够自动释放次中的对象的。NSObject类提供了一个autorelease消息,当我们想一个对象发送autorelease消息的时候,这个对象就会随着释放池的销毁而释放。当自动释放池销毁时,自动释放池会对这些对象发送一条release消息。自动释放池并不是销毁对象,只是自动释放池内调用了autorelease消息的对象进行一次release操作。当我们向自动释放池pool发送release消息时,它会向池中的每一个发送了autorelease消息的对象发送一条release消息,并且自身也会销毁。当向它发送drain消息时,只会释放池里面的对象,而不会销毁自己。


对于dealloc方法:
主要功能是释放成员变量的所有权,释放不再使用的内存。
此方法是从NSObject继承来的,不需要在.h文件中进行声明。
此方法不能手动调用,只有当对象的引用计数器为0时才调用。
重写此方法一定要调用父类的dealloc方法来释放父类的实例,即[super dealloc]。一般来说调用的顺序是,当子类的对象释放完时,然后再释放父类的所拥有的实例。

ARC(Automatic Reference Counting)
ARC是Xcode4以后推出的一种机制,它不同于Java的垃圾回收机制。它是在程序编译时自动将内存管理的代码添加到程序中,

不需要程序员管理内存。在Xcode5取消了非ARC的选项。


2、ios的ARC和java的垃圾回收机制区别

1)Objective-C是动态语言, Java是静态语言。

2)前者发生在编译期,后者在运行时

3)极大减轻了程序员管理内存的负担,但其本质依然是编译期的基于引用计数的内存管理


3、ARC的基本使用

1)ARC的判断准则:只要没有强指针指向对象,就会释放对象(指针分强指针和弱指针,默认情况下所有指针都是强指针__strong;

弱指针:__weak Person *p = [[Person alloc] init]; 如果对象销毁了,弱指针还在,arc会自动把弱指针清空

Person *p = [[Person alloc] init]; //创建了一个强指针
p = nil; //对象被释放,编译器会自动在下一句加上:[p release]


2)对象在arc不需要retain

原来不用arc的时候:

在.h文件

@property (nonatomic, retain) Dog *dog;

在.m文件

- (void)dealloc
{
    [Dog release]
    NSLog(@"Person is dealloc");
    [super dealloc];
}

使用arc后

在.h文件:吧以前的retain换成strong

@property (nonatomic, strong) Dog *dog;

 3、ARC特点
 1> 不允许调用release、retain、retainCount
 2> 允许重写dealloc,但是不允许调用[super dealloc]
 3> @property的参数
  * strong :成员变量是强指针(适用于OC对象类型)
  * weak :成员变量是弱指针(适用于OC对象类型)
  * assign : 适用于非OC对象类型
 4> 以前的retain改为用strong


4、当两端循环引用的时候,解决方案(记住!!):
 1> ARC
 1端用strong,另1端用weak
 
 2> 非ARC
 1端用retain,另1端用assign


 ----------------------------------------  android培训java培训、期待与您交流! -------------------------------------------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值