• 内存管理


    1.范围 

    任何继承了NSObject的对象,对基本数据类型无效 

    2.原理 

    每个对象内部都保存了一个与之相关联的整数,称为引用计数器 

    当使用alloc、new、copy、mutableCopy创建一个对象的时,对象的引用计数器设置为1。 

    给对象发送一条retain消息,可以使引用计数器+1 

    给对象发送一条release消息,可以使引用计数器-1 

    当一个对象的引用计数器值为0时,那么它将被销毁,其占用的内存被系统收回。OC也会自动发送一条dealloc消息,一般会重写dealloc方法,在这里做释放相关的资源。一定不要直接调用dealloc方法。 

    可以给对象发送retainCount消息获取当前的引用计数器值 

    3.原则 

    谁创建,谁释放(”谁污染、谁治理“)。如果你通过alloc、new或(mutable)copy来创建一个对象,那么你必须调用release和autorelease。换句话说,不是你创建的,就不用你去释放 

    一般来说除了alloc、new或copy之外的方法创建的对象,都声明了autorelease 

    谁retain,谁release。只要你调用了retain,无论这个对象是如何生成的,你都要调用release 

    4.注释 

    1 #pragma mark -分组   
    2 #pragma mark 方法注释   
    3 #pragma mark - 公共方法   
    4 #pragma mark 读书   
    5 -(void)readBook   
    6 {   
    7     NSLog(@"当前读的书是:%f",_book.prize);   
    8 } 

    5.set方法的内存管理 

    1.普通类型:只需要@property int age; 

    2.OC类型:需要@property Book*book,声明属性,实现set方法(先判断是否相等,release旧的,retain新的),在dealloc:方法中release; 

     1 -(void)setBook:(Book *)book   
     2 {   
     3     if (_book != book) {   
     4         //先释放旧的成员变量   
     5         [_book release];   
     6         //在retain新传进来的对象   
     7         _book = [book retain];   
     8     }   
     9 }   
    10 #pragma mark 回收对象   
    11 - (void)dealloc   
    12 {   
    13     [_book release];   
    14     NSLog(@"student:%i 被销毁了",_age);   
    15     [super dealloc];   
    16 }  

    6.空指针和野指针 

    空指针:不报错 

    [nil release]; 

    野指针:访问了不属于你的内存,会报错 

    [stu release]; 

    //野指针 

    [stu release]; 

    7.@property参数 

    1.读写属性: 

    readwrite(默认) 

    readonly:只生成get方法声明 

    2.setter处理 

    assign(默认) 

    retain:在setter方法中,release旧值,retain新值 

    copy:在setter方法,release旧值,copy新值 

    3.原子性: 

    atomicity(默认) 

    atomicity:给方法进行枷锁,保证多线程安全 

    4.getter/setter方法 

    getter=isRich/setter=rich 

    getter:指定getter方法的方法名 

    8.自动释放池(autorelease pool) 

    自动释放池也是OC里面一种内存自动回收机制,一般可以将一些临时变量添加到自动释放池中,统一回收释放 

    当自动释放被销毁的时候,池里的所有对象,都会调用一次release方法 

    @autoreleasepool{}:手动创建一个自动释放池。   

    1  @autoreleasepool {   
    2         Student *stu = [[Student alloc]init];   
    3         [stu release];   
    4     }   
    5 //iOS5.0前   
    6 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];   
    7 … …   
    8 [pool release];   

    9.autorelease 

    OC对象只需要发送一条autorelease消息,就会把这个对象添加到最近的自动释放池中(栈顶的释放池)。 

    autorelease实际上只是把release调用延迟了,对于每一次autolease,系统只是把该对象放入了当前的autorelease pool中,当该pool被释放时,该pool中的所有对象都会调用release方法 

    10.autorelease pool注意 

    在ARC下,不能使用[[NSAutoreleasePool alloc]init]创建自动释放池,应当使用@autoreleasepool 

    不要把大量的循环操作放到同一个NSAutoreleasePool 之间,这样会造成内存峰值上升 

    尽量避免对大内存使用该方法,对于这种延迟释放机制,还是尽量少用 

    sdk一般利用静态方法创建并返回对象都是已经autorelease的,不需要再进行release操作

  • 相关阅读:
    Bandicam班迪录屏 高清录制视频软件
    理解WebKit和Chromium: 浏览器综述
    GDAL对于raw数据支持的一个bug
    关于GDAL计算图像坐标的几个问题
    理解WebKit和Chromium: WebKit资源加载机制
    关于web服务器架构的思考
    使用PROJ4库将地心直角坐标(XYZ)转为地心大地坐标(BLH)
    Java数据类型和MySql数据类型对应表
    理解WebKit和Chromium: 基于Chromium内核的Android WebView
    【Unity探究】物理碰撞实验
  • 原文地址:https://www.cnblogs.com/H7N9/p/4890958.html
Copyright © 2020-2023  润新知