• Objective-C 内存管理retain和release


    OC使用引用计数来管理内存,每个继承NSObject的对象,内部都维护了一个引用计数器retainCount。当对象创建时(调用alloc或者new)引用计数器会+1, 手动调用retain()方法能够使引用计数器+1。手动调用release()方法能够使引用计数器-1,当引用计数器为0时,对象会自己主动调用"析构函数" dealloc()方法来回收资源和释放内存。

    这样当一个对象被多个地方使用和管理时,能够通过retain()将引用计数器+1,来获取使用权限(防止其它使用者释放该对象)。用完了之后再通过调用release()将引用计数器-1来放弃使用权限(此时假设引用计数器为0,说明没有其它地方再使用该对象了。直接会被释放。假设引用计数器不为0,则证明还有其它地方再使用这个对象,该对象不会被释放)。

    这是一种设计很优雅的内存管理机制,谁使用谁retain()用完之后release(),假设已经没有人使用它了。引用计数器为0,则释放掉。

    //
    //  Goods.h
    //  08_Retain&&Release
    //
    //  Created by apple on 14-11-12.
    //  Copyright (c) 2014年 cc. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    
    @interface Goods : NSObject
    
    @property int price;
    
    
    /**
     *  dealloc方法,对象释放时会调用。用于资源的回收,相当于C++中的析构函数
     *  dealloc方法须要重写父类的方法,实现释放当前类的资源
     */
    - (void)dealloc;
    
    @end
    

    //
    //  Goods.m
    //  08_Retain&&Release
    //
    //  Created by apple on 14-11-12.
    //  Copyright (c) 2014年 cc. All rights reserved.
    //
    
    #import "Goods.h"
    
    @implementation Goods
    
    - (void)dealloc {
        
        //TODO: 释放资源码
        
        NSLog(@"%@被释放了", self);
    
        //须要调用父类来释放对象
        [super dealloc];
    }
    
    @end
    

    //
    //  main.m
    //  08_Retain&&Release
    //
    //  Created by apple on 14-11-12.
    //  Copyright (c) 2014年 cc. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    #import "Goods.h"
    
    int main(int argc, const char * argv[]) {
    
        @autoreleasepool {
        
            //当调用alloc或者new创建一个OC对象时,引用计数+1
            Goods* pGoods = [[Goods alloc] init];
            //输出: 1
            NSLog(@"retainCount=%lu", (unsigned long)[pGoods retainCount]);
            
            //调用retain时引用计数+1
            [pGoods retain];
            //输出: 2
            NSLog(@"retainCount=%lu", (unsigned long)[pGoods retainCount]);
    
            //调用release时引用计数-1
            [pGoods release];
            //输出: 1
            NSLog(@"retainCount=%lu", (unsigned long)[pGoods retainCount]);
    
            //调用release时引用计数-1,此时retainCount为0。内存将被释放。自己主动调用realloc来释放资源和内存
            [pGoods release];
            
        }
        return 0;
        
    }
    


  • 相关阅读:
    MYSQL中排序
    编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary)
    job1
    python中对于数组的操作
    python中将字符串转为字典类型
    python中的周几
    python 链接redis 获取对应的值
    jenkins 设置定时任务规则
    如何安全close go 的channel
    [转]
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/7136621.html
Copyright © 2020-2023  润新知