• release 和 drain


    转载自:http://tieba.baidu.com/p/3427605546

    当您向一个对象发送一个autorelease消息时,Cocoa就会将该对象的一个引用放入到最新的自动释放池。它仍然是个正当的对象,因此自动释放池定义的作用域内的其它对象可以向它发送消息。当程序执行到作用域结束的位置时,自动释放池就会被释放,池中的所有对象也就被释放。 

    1. ojc-c 是通过一种"referring counting"(引用计数)的方式来管理内存的, 对象在开始分配内存(alloc)的时候引用计数为一,以后每当碰到有copy,retain的时候引用计数都会加一, 每当碰到release和autorelease的时候引用计数就会减一,如果此对象的计数变为了0, 就会被系统销毁.
    2. NSAutoreleasePool 就是用来做引用计数的管理工作的,这个部分后面会详细说到. 
    3. autorelease和release没什么区别,只是引用计数减一的时机不同而已,autorelease会在对象的使用真正结束的时候才做引用计数减一. 


    NSAutoreleasePool详解:
    1. NSAutoreleasePool实际上是个对象引用计数自动处理器。NSAutoreleasePool可以同时有多个,它的组织是个栈,总是存在一个栈顶pool,也就是当前pool,每创建一个pool,就往栈里压一个,改变当前pool为新建的pool,然后,每次给pool发送drain消息,就弹出栈顶的pool,改当前pool为栈里的下一个 pool。


    2. 在程序的入口main函数就调用NSAutoreleasePool,这样保证程序中不调用NSAutoreleasePool,但在退出时自动释放。新开线程最好实现NSAutoreleasePool


    3. NSAutoreleasePool的管理范围是在NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];与[pool release];之间的对象


    4. NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
    当执行[pool autorelease]的时候,系统会进行一次内存释放,把autorelease的对象释放掉,如果没有NSAutoreleasePool , 那这些内存不会释放
    注意,对象并不是自动被加入到当前pool中,而是需要对对象发送autorelease消息,这样,对象就被加到当前pool的管理里了。当当前pool接受到drain消息时,它就简单的对它所管理的所有对象发送release消息。
    例如
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    NSString* nsstring;
    char* cstring = "Hello CString";
    nsstring = [NSString stringWithUTF8String:cstring];
    [pool release];


    5. alloc的对象必须显示释放
    例如:
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    NSString* string = [[NSString alloc] init];
    [string stringByAppendingString:@"Hello World!"];
    [pool release];
    [nsstring release];


    6如果使用Automatic Reference Counting(ARC).不能直接使用autorelease pools,而是使用@autoreleasepool{},
    @autoreleasepool{}比直接使用NSAutoreleasePool效率高。不使用ARC的时候也可以使用

    7 在引用计数环境中,drain和release一样,但是在garbage-collected环境中,使用drain,触发GC(in a garbage-collected environment, triggers garbage collection if the memory allocated since the last collection is greater than the current threshold)。

  • 相关阅读:
    python 的时间复杂度
    python之进制转换
    进程、线程、协程
    [GO]gtk的windows环境搭建
    [GO]并的爬取捧腹的段子
    [GO]并发的网络爬虫
    [GO]百度贴吧的爬虫
    [operator]jenkins+gitlab/Webhook自动构建发布
    [GO]并发实现聊天室服务器
    [GO]文件的收发服务器
  • 原文地址:https://www.cnblogs.com/pencilCool/p/4669364.html
Copyright © 2020-2023  润新知