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; }

最新文章

  1. 迁移Reporting Services的方法与WMI错误
  2. iOS-设置UIPageControl 显示图片
  3. 使用uwsgi 部署python web服务
  4. jQuery 常用的代码片段
  5. oracle基本语句
  6. 用 Freemarker 生成 word 文档(包含图片)
  7. js中substring和substr的用法
  8. 修改IIS7中ASP的上传文件大小限制
  9. OpenCV2.4.6与vs2008配置问题
  10. Oracle Form属性、内置子程序、触发器、系统变量简要
  11. Java-Hirbernate中文乱码问题
  12. 关于通用的C#后台获取前台页面的标签的正则表达式
  13. [转]从入门到精通: 最小费用流的“zkw算法”
  14. vue中如何获取后台数据
  15. R语法学习 第十二篇:因子
  16. Servlet+jSP+java实现商品信息和流水的操作
  17. python实现将android手机通讯录vcf文件转化为csv
  18. You Only Look Once: Unified, Real-Time Object Detection(翻译)
  19. 码出高效,阿里巴巴JAVA开发手册1.4.0
  20. NHibernate的搭建

热门文章

  1. 单页vue路由router
  2. python compare with other language
  3. Chrome插件:本地程序实现验证码破解(浏览器与本地进程通信)
  4. 「 Luogu P2196 」 挖地雷
  5. Jmeter关联-获取token值
  6. Python 循环语句(break和continue)
  7. 九度oj 题目1056:最大公约数
  8. 使用mysql-proxy 快速实现mysql 集群 读写分离
  9. noip模拟赛 补兵
  10. SpringBoot Data JPA 关联表查询的方法