如果你能够真正的理解autorelease,那么你才是理解了Objective c的内存管理。Autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的Autorelease pool中,当该pool被释放时,该pool中的所有Object会被调用Release。
[1]在Iphone项目中,大家会看到一个默认的Autorelease pool,程序开始时创建,程序退出时销毁,按照对Autorelease的理解,岂不是所有autorelease pool里的对象在程序退出时才release, 这样跟内存泄露有什么区别?
答案是,对于每一个Runloop, 系统会隐式创建一个Autorelease pool,这样所有的release pool会构成一个象CallStack一样的一个栈式结构,在每一个Runloop结束时,当前栈顶的Autorelease pool会被销毁,这样这个pool里的每个Object会被release。
那什么是一个Runloop呢? 一个UI事件,Timer call, delegate call, 都会是一个新的Runloop。例子如下:
- NSString* globalObject;
- - (void)applicationDidFinishLaunching:(UIApplication *)application
- {
- globalObject = [[NSString alloc] initWithFormat:@"Test"];
- NSLog(@"Retain count after create: %d", [globalObject retainCount]); // output 1.
- [globalObject retain];
- NSLog(@"Retain count after retain: %d", [globalObject retainCount]); // output 2.
- }
- - (void)applicationWillTerminate:(UIApplication *)application
- {
- NSLog(@"Retain count after Button click runloop finished: %d", [globalObject retainCount]);
- // 输出1. Button click loop finished, it's autorelease pool released, globalObject get released once.
- }
- -(IBAction)onButtonClicked
- {
- [globalObject autorelease];
- NSLog(@"Retain count after autorelease: %d", [globalObject retainCount]);
- // 输出2。 Autorelease被call, globalObject被加如当前的AutoreleaePool。
- }
[2]为什么需要Auto release ?
2.1)很多C/C++转过来的程序员会说,这个auto release有什么好,象C/C++那样,自己申请,自己释放,完全可控不好么, 这个auto relase 完全不可控,你都不知到它什么时候会被真正的release。我的理解它有一个作用就是可以做到每个函数对自己申请的对象负责,自己申请,自己释放,该函数的调用者不需要关心它内部申请对象的管理。 在下面这个例子中,Func1的调用者不需要再去关心obj的释放。
- ClassA *Func1()
- {
- ClassA *obj = [[[ClassA alloc]init]autorelease];
- return obj;
- }
实际上对于 [NSString stringWithFormat:] 这类构造函数返回的对象都是autorelease的。
2.2) autorelease pool来避免频繁申请/释放内存(就是pool的作用了)。这个应该是相对比较好理解的。
总结:1)一定要注意Autorelease pool的生存周期,理解Runloop,避免在对象被释放后使用。
2)[NSString stringWithFormat:]这类函数返回的对象是不需要再自己release的,它已经被autorelease了, 如果你想把它当一个全局对象使用,那必须自己再retain, 释放时再release。
原文标题:Objective C内存管理进阶(二):理解autorelease
链接:http://www.cnblogs.com/MobileDevelop/archive/2010/07/19/1779138.html
相关推荐
此外,Objective-C 的内存管理机制也是其核心组成部分之一,尤其是 Autorelease Pool 这一概念,在现代 Objective-C 编程中扮演着至关重要的角色。 #### 1. Autorelease Pool 基础 Autorelease Pool 是 Objective-...
此外,Objective-C还提供了自动释放池(Autorelease Pool),允许对象在自动释放池中注册后,由自动释放池来管理内存的释放时机。 为了简化代码,Objective-C引入了宏定义来帮助开发者自动执行释放内存的操作。例如...
随着ARC的引入,程序员需要关注的内存管理细节减少,但理解这些基本概念仍然是编写高质量Objective-C代码的基础。在实际开发中,配合Instruments工具进行内存泄漏检查和性能分析也是提升应用质量的有效手段。
Objective-C的内存管理机制与.NET和Java等语言中常见的自动垃圾回收机制不同,它更接近于C语言的手动管理方式,但在此基础上加入了一些自动化手段,使得开发人员能够在一定程度上简化内存管理的工作。 ##### 1. ...
内存管理是编程中至关重要的部分,Objective-C 在内存管理方面采用了引用计数(Reference Counting)策略,直到iOS 5.0后引入了ARC(Automatic Reference Counting),但这并不改变对旧版内存管理机制的理解。...
Objective-C的内存管理机制不同于.NET或Java等高级语言中的全自动垃圾回收机制,它更接近于C语言的手动管理方式,但在一定程度上增加了自动化特性。 1. **对象的生成与指针指向**:Objective-C的对象通常是在堆上...
Objective-C 的内存管理虽然相对复杂,但通过理解其基本原理,如引用计数机制和自动释放池,以及使用现代的自动化工具如 ARC,可以有效地管理内存并编写出高质量的应用程序。掌握这些概念对于任何 Objective-C ...
//...} // obj1 会被自动释放,因为它是自动释放池内的对象```了解了这些基本概念后,你就能更好地理解 Objective-C 的内存管理机制,避免内存泄漏和意外崩溃。实践中,掌握好这些原则并结合 Xcode 的内存分析工具...
Objective-C的内存管理机制是基于手动...理解并正确使用这些内存管理原则是编写无内存泄漏的Objective-C代码的关键。虽然相比自动垃圾回收,这种方式需要更多的手动工作,但它提供了更好的性能控制和内存优化的可能性。
在Objective-C中,内存管理是程序稳定性和性能的关键部分。Objective-C使用了引用计数(Reference Counting)机制,这是其内存管理的核心。本练习主要关注如何有效地使用和理解这个机制,以及ARC(Automatic ...
iOS高级内存管理编程指南主要介绍了iOS环境下对象的内存管理机制,尤其在Objective-C编程语言中的内存管理方式。在iOS应用开发中,内存管理对于保证应用的稳定运行至关重要。本文将详细介绍iOS内存管理的知识点,...
为了更好地理解Objective-C中的内存管理机制,我们可以参考一个简单的示例。假设我们需要创建一个应用来记录喜爱的寿司类型。为了实现这个功能,我们需要创建一个数组来存储各种寿司类型的名称,并在每次显示一行时...
在早期版本的Objective-C中,程序员需要手动管理内存,使用引用计数(retain/release/autorelease)来跟踪和管理对象的生命周期。而在Objective-C 2.0中引入了自动引用计数(Automatic Reference Counting,简称ARC...
在Objective-C的内存管理中,Objective-C引入了引用计数(Reference Counting)和ARC(Automatic Reference Counting)。引用计数是通过`retain`、`release`和`autorelease`来管理对象生命周期的,而ARC则是编译器...
Objective-C编程第二版,可能是为了适应技术的更新和开发者的需求而进行的一次修订,旨在帮助程序员深入理解和熟练掌握Objective-C语言。 Objective-C是C语言的超集,它在C的基础上添加了面向对象的概念,如类、...
Objective-C作为苹果开发环境的主要语言之一,其内存管理机制区别于自动管理的.NET或Java。Objective-C采用的是引用计数(Reference Counting)系统,通过手动调用`retain`和`release`方法来增加或减少对象的引用...
6. **内存管理**:Objective-C使用引用计数(ARC,Automatic Reference Counting)进行内存管理。学习何时创建和释放对象,理解`retain`、`release`、`autorelease`等方法,以及ARC如何自动处理这些。 7. **GCD...
6. **内存管理**:在Objective-C的早期版本中,手动内存管理是必需的,涉及引用计数(retain, release, autorelease)。现代Objective-C使用ARC(Automatic Reference Counting),自动管理内存,但仍需理解其工作...