加载中…
正文 字体大小:

ios内存管理数据结构之NSAutoreleasePool和@autoreleasepool。

(2013-02-16 22:49:01)
标签:

nsautoreleasepool

autorelease

eventloop

分类: ios内存回收及管理的实现
1.两者分别的使用方法。
1.  NSAutoreleasePool
          NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init;
            // Code benefitting from a local autorelease pool .
            [pool release];

            嵌套使用 以及 优化使用 方式如下: 目的是减少内存的峰值
         NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

         for (int i = 0 ; i < 10000; i++)

        {

            DJObject * object = [[[DJObject alloc] init] autorelease];

            object.ID = i;

            if (i % 100 == 0)

           {

                [pool release];

                pool = [[NSAutoreleasePool alloc] init];

           }

      }

      [pool release];

2.   @autoreleasepool
    @autoreleasepool {
      // Code benefitting from a local autorelease pool.
      }

      嵌套使用方式为: 此方式虽然使用ARC 和 手动管理内存的方法, 但由于起在while循环和for循环       中并不好用

    @autoreleasepool

    {

        //code

        @autoreleasepool

        {

            //code

        }

        //code

    }

2. 存储原理实现分析,两者的本质是一样的
纠正网上的一个错误,NSAutoReleasePool 的内部是有个栈的数据结构, 并非数组 NSMutableArray的数据结构,原因如下:
1.经验证对象释放的顺序 是按照后进先出的顺序, 符合栈的数据结构。
2.NSMutableArray这个容器本身 会对对象进行引用计数+1,释放一次是无法释放对象,需要 两次release消息才能释放,作为类库的开发者如果这样做造成了效率降低,故此栈的数据结构 存储不对其进行引用计数增加,只是保存而已。

大胆猜测: 此栈数据结构 主要是进行遍历, 以线性表栈实现的可能性比较大, 这样遍历的效率比较高。

3. NSAutoReleasePool 和 线程
每个线程即thread都拥有一个栈stack,这个栈存储的都是pool对象, 对NSObject和其子类 发送autorelease消息,都会将这个对象放进执行这个消息所在线程的栈顶的pool中,等到 pool release的时候,对pool中栈数据结构中存储对象按照后进先出的顺序 进行遍历 对每个 对象发送release消息,对象可以发送无数此autorelease消息, pool不对其进行验证,只是 简单遍历发送release消息,说明对于对象的内存管理还是得严格遵守内存管理法则。

当使用unix标准c线程posix时, 必须之前 实例化一个NSThread, 并且通过isMultiThreaded,处在多线程下, 在实例化一个NSThread之后才能使用cocoa, 包括pool. 

4. 使用NSAutoReleasePool的注意点。
1.ios5.0 之前 默认创建的线程 需要显式的创建pool对象, 然后在线程结束尾销毁池子, 在 ios5.0以及以后会自动创建一个pool对象, 如果对一个cocoa对象发送的autorelease消息, 执行发送消息的线程没有pool可用, 则会造成内存泄漏。
2.对pool对象本身不能进行retain autorelease, 否则会crash即崩溃掉, 大胆猜测应该是 重写了这两个方法,调用两个方法时做了crash操作 这两个方法都是来自协议 protocolNSObject,crash的原因是, 本身pool数据结构是管理内存所用,如果可以 autorelease和retain会增加程序复杂性。
3.只有NSObject以及子类 发送了autorelease消息的对象才会被放进池子中存储。

5. 何时创建NSAutoReleasePool

1.在自动生成的xcode工程当中,在main方法的开始会创建一个, 然后main结束即主线程 thread退出时释放。
2.run loop的每次iteration即迭代 中在每个事件循环即event loop的开始会创建一个, 在 结束时会销毁, 这样就能及时的释放内存,event loop包含有 触摸, 用户输入, 网络接收 数据包含socket和异步回调NSUrlConnection,定期或时间延迟时间即NSTimer, perfrom, 经常使用的摇一摇的回调等, 这样 即使没有手动创建, 在程序运行的过程中也会时刻在释放内存.
3. 可以按照使用方法那样手动进行创建。

6. 使用内存管理的好处与缺点
优点
1.使用此内存管理, 可以使用从某个method方法返回的对象而不用操心其释放时间,专心处理其他的事情,而c和c++两本语言则需要处理这个返回对象内存的释放。
缺点
1.这样有可能会造成已用内存的增加, 需要及时的去清理内存才行。

0

阅读 评论 收藏 转载 喜欢 打印举报
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有