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所占用的内存较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空间.比如回收一 ...
随机推荐
- SQL表变量与临时表区别 + 非游标临时表遍历
SQL表变量与临时表区别 + 非游标临时表遍历 分类: SQL Server2009-11-27 17:01 1196人阅读 评论(2) 收藏 举报 sqlinsert存储sql servermicr ...
- pytorch记录:seq2seq例子看看这torch怎么玩的
先看看简单例子: import torch import torch.autograd as autograd import torch.nn as nn import torch.nn.functi ...
- linux中查看文件指定行的数据
http://jingyan.baidu.com/article/15622f24125872fdfdbea560.html
- 笔试算法题(24):找出出现次数超过一半的元素 & 二叉树最近公共父节点
出题:数组中有一个数字出现的次数超过了数组长度的一半,请找出这个数字: 分析: 解法1:首先对数组进行排序,时间复杂度为O(NlogN),由于有一个数字出现次数超过了数组的一半,所以如果二分数组的话, ...
- Java多线程基础(面试向)
----?为什么要用到多线程 CPU是以时间片的方式为进程分配CUP处理时间的,如果当一个进程同时要完成几件事的时候,如当从网上下载文件的时候,需要一边下载一边显示进度而且还要一边保存,如果按照单线程 ...
- DNS服务器原理简述、搭建主/从DNS服务器并实现智能解析
1. TLD:Top Level Domain 顶级域名 组织域:.com, .net, .org, .gov, .edu, .mil 国家域:.iq, .tw, .hk, .jp, .cn, ... ...
- W3C Blog: HTML-下一步是什么?
HTML5.1 草稿版: 地址:https://www.w3.org/TR/html51/introduction.html#a-quick-introduction-to-html 2016年3月0 ...
- SPOJ - QTREE Query on a tree题解
题目大意: 一棵树,有边权,有两个操作:1.修改一条边的权值:2.询问两点间路径上的边的权值的最大值. 思路: 十分裸的树链剖分+线段树,无非是边权要放到深度大的一端的点上,但是有两个坑爹的地方,改了 ...
- HDU 4035 期望dp
这道题站在每个位置上都会有三种状态 死亡回到起点:k[i] 找到出口结束 e[i] 原地不动 p[i] k[i]+e[i]+p[i] =1; 因为只给了n-1条路把所有都连接在一起,那么我们可以自然的 ...
- codeforces 359A
#include<stdio.h> #define N 60 int map[N][N]; int main() { int n,m,i,j,flag; while(scanf(&qu ...