zoukankan      html  css  js  c++  java
  • Objective C内存管理之理解autorelease------面试题

    Objective C内存管理之理解autorelease

     

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

    专题:iPhone应用程序开发初探

    [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。例子如下:

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

    [2]为什么需要Auto release ?

    2.1)作用就是可以做到每个函数对自己申请的对象负责,自己申请,自己释放,该函数的调用者不需要关心它内部申请对象的管理。 

    在下面这个例子中,Func1的调用者不需要再去关心obj的释放。

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

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

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

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

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

     

  • 相关阅读:
    轮叫调度(RoundRobin Scheduling)
    Python的Daemon管理器zdaemon
    How do you select a particular option in a SELECT element in jQuery? Stack Overflow
    元宵爬虫YuanXiaoSpider
    python 异步采集,网页爬虫编写 | 一步一步学python
    吉林省明日科技有限公司
    简单分析C之Curl模块同php的curl和python的pycurl模块的关系
    fputs
    v专用链接破解器 专用链接破解器
    crawler jd
  • 原文地址:https://www.cnblogs.com/iOS-mt/p/4175869.html
Copyright © 2011-2022 走看看