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; }
Objective-C 内存管理retain和release的更多相关文章
- Objective C内存管理之理解autorelease------面试题
Objective C内存管理之理解autorelease Autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的A ...
- (转)IOS内存管理 retain release
obj-c本质就是"改进过的c语言",大家都知道c语言是没有垃圾回收(GC)机制的(注:虽然obj-c2.0后来增加了GC功能,但是在iphone上不能用,因此对于iOS平台的程序 ...
- Objective C 内存管理[转]
1 配对原则 alloc – release new – release retain - release copy – release 2 new和alloc-init的区别 (1)区别只在于a ...
- iOS内存管理retain,assign,copy,strong,weak
转自:http://www.cnblogs.com/nonato/archive/2013/11/28/3447162.html iOS的对象都继承于NSObject, 该对象有一个方法:retain ...
- objective C 内存管理及属性方法具体解释
oc为每一个对象提供一个内部计数器.这个计数器跟踪对象的引用计数,当对象被创建或拷贝时.引用计数为1.每次保持对象时,调用retain接口.引用计数加1.假设不需要这个对象时调用release,引用计 ...
- OC 内存管理(retain和release)
内存管理 retain和release简单使用 #import "Student.h" @implementation Student @synthesize age = _age ...
- objective-c 语法快速过(6)内存管理原理
内存管理基本原理(最重要) 移动设备的内存极其有限(iphone 4内存512M),每个app所能占用的内存是有限制的(几十兆而已). 当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不 ...
- OC中的内存管理
一. 基本原理 1. 什么是内存管理 移动设备的内存极其有限,每个app所能占用的内存是有限制的 当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空间.比如回收一些不需 ...
- 内存管理、ARC
内存管理 一.基本原理 1.什么是内存管理 移动设备的内存极其有限,每个app所能占用的内存是有限制的 当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空间.比如回收一 ...
随机推荐
- Django中使用多线程发送邮件
1.settings.py 增加Email设置 #mail EMAIL_HOST = ‘smtp.gmail.com’ #邮件smtp服务器 EMAIL_POR ...
- js 给url添加时间戳 解决浏览器缓存
//解决浏览器缓存 function timestamp(url){ // var getTimestamp=Math.random(); var getTimestamp=new Dat ...
- MySQL操作数据库和表的基本语句(DDL)
1.创建数据库: CREATE DATABASE 数据库名; eg.CREATE DATABASE test_ddl;2.创建表 CREATE TABLE 表名(列名 数据类型 约束,...); eg ...
- jQuery中Ajax事件beforesend及各参数含义1
jQuery中Ajax事件beforesend及各参数含义 转自:http://blog.sina.com.cn/s/blog_609f9fdd0100wprz.html Ajax会触发很多事件. 有 ...
- C# Word 类库
C# Word 类库 2009-08-06 22:10 14292人阅读 评论(11) 收藏 举报 c#objectstring文档microsoftexcel using System;using ...
- vue按需加载组件-webpack require.ensure
使用 vue-cli构建的项目,在 默认情况下 ,执行 npm run build 会将所有的js代码打包为一个整体, 打包位置是 dist/static/js/app.[contenthash].j ...
- 关于阻止Sublime Text更新弹窗提示
使用Sublime Text有一段时间了,但每次重新打开都会弹出这家伙↑,很烦 网上查了查一些关闭弹窗的教程,大同小异,都说是打开Preferences --> Settings, 添加一行代码 ...
- django找不到报错 ‘zsh: command not found: django-admin.py’
>>python -m django --version >> 1.11.4 说明django安装成功,但是django-admin 报错 ‘zsh: command not ...
- python Django 相关学习笔记
Django框架 pip3 install django 命令: # 创建Django程序 django-admin startproject mysite # 进入程序目录 cd mysite # ...
- CSDN编写技巧--CSDN中高亮显示代码
1, 最近在编写CSDN博客的时候,有种生不如死的感觉,就是如下的现象: 除了图中圈红圈的部分,还有就是背景色是灰色,并且,关键字不高亮显示,起始正常的情况下,也会有这块区域的最上边这行. 2, 有一 ...