Objective-C内存管理如何理解Autorelease

移动开发 iOS
Objective-C内存管理如何理解Autorelease是本文要介绍的内容,主要是来学习Autorelease如何使用,具体内容来看本文详细讲解。如果你能够真正的理解autorelease,那么你才是理解了Objective-C的内存管理。

Objective-C内存管理如何理解Autorelease是本文要介绍的内容,主要是来学习Autorelease如何使用,具体内容来看本文详细讲解。如果你能够真正的理解autorelease,那么你才是理解了Objective-C内存管理

Autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的Autorelease pool中,当该pool被释放时,该pool中的所有Object会被调用Release。

实际上对于 [NSString stringWithFormat:] 这类构造函数返回的对象都是autorelease的。

autorelease pool来避免频繁申请/释放内存(就是pool的作用了)。这个应该是相对比较好理解的。

总结:一定要注意Autorelease pool的生存周期,理解Runloop,避免在对象被释放后使用。

  1. [NSString stringWithFormat:] 

这类函数返回的对象是不需要再自己release的,它已经被autorelease了, 如果你想把它当一个全局对象使用,那必须自己再retain, 释放时再release。

为什么需要Auto release ?

很多C/C++转过来的程序员会说,这个auto release有什么好,象C/C++那样,自己申请,自己释放,完全可控不好么, 这个auto relase 完全不可控,你都不知到它什么时候会被真正的release。我的理解它有一个作用就是可以做到每个函数对自己申请的对象负责,自己申请,自己释放,该函数的调用者不需要关心它内部申请对象的管理。  在下面这个例子中,Func1的调用者不需要再去关心obj的释放。

  1. ClassA *Func1()  {       
  2.  ClassA *obj = [[[ClassA alloc]init]autorelease];  
  3.        return obj;    
  4.  }  

在Iphone项目中,大家会看到一个默认的Autorelease pool,程序开始时创建,程序退出时销毁,按照对Autorelease的理解,岂不是所有autorelease pool里的对象在程序退出时才release, 这样跟内存泄露有什么区别?

答案是,对于每一个Runloop, 系统会隐式创建一个Autorelease pool,这样所有的release pool会构成一个象CallStack一样的一个栈式结构,在每一个Runloop结束时,当前栈顶的Autorelease pool会被销毁,这样这个pool里的每个Objective-C会被release。

那什么是一个Runloop呢? 一个UI事件,Timer call, delegate call, 都会是一个新的Runloop。例子如下:

  1. NSString* globalObject;    
  2. - (void)applicationDidFinishLaunching:(UIApplication *)application   {      
  3.       globalObject = [[NSString alloc] initWithFormat:@"Test"];        
  4.       NSLog(@"Retain count after create: %d", [globalObject retainCount]);   
  5.       // output 1.      [globalObject retain];        
  6.       NSLog(@"Retain count after retain: %d", [globalObject retainCount]);   
  7.       // output 2.   
  8.     }    
  9.   - (void)applicationWillTerminate:(UIApplication *)application  {     
  10.         NSLog(@"Retain count after Button click runloop finished: %d", [globalObject retainCount]);         
  11.         // 输出1. Button click loop finished, it's autorelease pool released, globalObject get released once.   
  12.     }    
  13.   -(IBAction)onButtonClicked  {       
  14.        [globalObject autorelease];        
  15.        NSLog(@"Retain count after autorelease: %d", [globalObject retainCount]);         
  16.        // 输出2。 Autorelease被call, globalObject被加如当前的AutoreleaePool。  
  17.  }  

小结:Objective-C内存管理:如何理解Autorelease的内容介绍完了,希望通过本文的学习能对你有所帮助!

责任编辑:zhaolei 来源: 互联网
相关推荐

2011-07-21 09:32:07

Objective-C 内存 Autoreleas

2010-07-20 08:50:00

autoreleaseObjective C

2011-05-11 15:45:50

内存管理Objective-C

2011-07-20 17:04:43

Objective-C 内存 内存泄露

2011-07-21 10:10:42

Objective-C 内存 Autoreleas

2011-07-18 17:14:16

Objective-C 内存 Cocoa

2011-08-01 11:37:41

iPhone Objective- 内存

2011-07-29 16:08:31

Objective-C 内存

2011-08-18 13:28:35

Objective-C内存

2011-07-19 15:15:09

Objective-C 内存

2011-07-21 09:42:27

Objective-C 内存 Autoreleas

2013-04-11 14:37:36

Objective-CiOS内存管理系统自动创建新的aut

2013-04-11 14:32:00

Objective-CiOS开发内存管理@synthesize

2015-07-08 10:51:27

Objective-CRuntime

2011-07-22 15:42:39

Objective-C UIView 内存

2011-08-10 18:07:29

Objective-C反射

2011-05-11 11:20:26

Objective-C

2013-03-27 12:54:00

iOS开发Objective-C

2011-05-11 15:58:34

Objective-C

2013-06-20 10:40:32

Objective-C实现截图
点赞
收藏

51CTO技术栈公众号