• 第六讲:ObjC 内存管理4 自动释放池


    转:http://tigercat1977.blog.163.com/blog/static/2141561122012111294616203/

    第六讲:Obj-C 内存管理4 - 自动释放池 

    主要内容
          什么是自动释放池
          自动释放池的好处
          如何创建一个自动释放池
          自动释放池如何释放对象内存

          自动释放池栈式结构管理

    Autorelease pool
         1. 自动释放池(Autorelease Pool)是 OC 的一种内存自动回收机制,可以将一些临时变量通过自动释放吃来回收统一释放
         2. 当自动释放池本身销毁的时候,池子里所有的对象都会做一次 release 操作

    autorelease

          任何OC对象只要调用 autorelease 方法,就会把该对象放大离自己最近的自动释放池中(栈顶的释放池)

    创建自动释放池 (两种方法)
        第六讲:Obj-C 内存管理4 - 自动释放池 - tigercat1977 - tiger notes
           IOS5.0 新方式
         @ autoreleasepool
          {
          }


          IOS5.0 之前的老方式
          NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

          [pool release];


    遛狗原理
        第六讲:Obj-C 内存管理4 - 自动释放池 - tigercat1977 - tiger notes

    典型例子(正确)
          Dog *dog1 = [[Dog alloc] init];
          [xiaoLi setDog:dog1];
         [dog1 release];

    典型例子 (错误)
          [xiaoLi setDog:[[Dog alloc] init]];
          上述代码有内存泄漏

    典型例子(正确)好的方法
         Dog *dog = [[[Dog alloc] init] autorelease];
          [xiaoLi setDog:dog1];
          //这里不能跟 [dog1 release];

    典型例子(正确) 放成一行
          [xiaoLi setDog:[[[Dog alloc] init] autorelease]];

    黄金法则
          如果对一个对象使用了 alloc, [mutable]copy, retain,那么必须使用相应的 release 或者 autorelease

    举例

    // Dog.h #import <Foundation/Foundation.h> @interface Dog : NSObject { int _ID; } @property int ID; @end

    // Dog.m #import "Dog.h" @implementation Dog @synthesize ID = _ID; - (void) dealloc { NSLog(@"dog %d dealloc", _ID); [super dealloc]; } @end


    // Person.h #import <Foundation/Foundation.h> #import "Dog.h" @interface Person : NSObject { Dog *_dog; } @property (retain) Dog *dog; @end

    // Person.m #import "Person.h" @implementation Person @synthesize dog = _dog; - (void) dealloc { self.dog = nil; NSLog(@"person dealloc"); [super dealloc]; } @end


    // main.m #import <Foundation/Foundation.h> #import "Person.h" #import "Dog.h" int main (int argc, const char * argv[]) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSLog(@"Hello, World!"); Person *xiaoLi = [[Person alloc] init]; Dog *dog1 = [[[Dog alloc] init] autorelease]; // 把 dog1 这条狗放在自动释放池里,上边的pool中 NSLog(@"dog1 retaincount is %ld", [dog1 retainCount]); xiaoLi.dog = dog1; NSLog(@"dog1 retaincount2 is %ld", [dog1 retainCount]); // [dog1 release]; // autorelease 了,不需要再 release [xiaoLi release]; NSLog(@"dog1 retaincount3 is %ld", [dog1 retainCount]); [pool release]; NSLog(@"end of release"); return 0; } /* 输出结果 Hello, World! dog1 retaincount is 1 dog1 retaincount2 is 2 person dealloc dog1 retaincount3 is 1 dog 0 dealloc end of release */






  • 相关阅读:
    【python小随笔】单例模式设计(易懂版)
    【python小随笔】函数的初始化与私有化
    【python小随笔】List列表的常见函数与切片
    【itsdangerous】的加密解密原理(易懂版)
    【Django入坑之路】Django后台上传图片,以及前端的显示
    【插拔式】分页+bootstrap4(开源)
    luogu P1231 教辅的组成 |网络流最大匹配
    luogu P3376 【模板】网络最大流 |Dinic
    luogu P4177 [CEOI2008]order |最大权闭合子图
    luogu P4562 [JXOI2018]游戏 |组合数学
  • 原文地址:https://www.cnblogs.com/jackljf/p/3589250.html
Copyright © 2020-2023  润新知