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的更多相关文章

  1. Objective C内存管理之理解autorelease------面试题

    Objective C内存管理之理解autorelease   Autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的A ...

  2. (转)IOS内存管理 retain release

    obj-c本质就是"改进过的c语言",大家都知道c语言是没有垃圾回收(GC)机制的(注:虽然obj-c2.0后来增加了GC功能,但是在iphone上不能用,因此对于iOS平台的程序 ...

  3. Objective C 内存管理[转]

    1  配对原则 alloc – release new – release retain - release copy – release 2  new和alloc-init的区别 (1)区别只在于a ...

  4. iOS内存管理retain,assign,copy,strong,weak

    转自:http://www.cnblogs.com/nonato/archive/2013/11/28/3447162.html iOS的对象都继承于NSObject, 该对象有一个方法:retain ...

  5. objective C 内存管理及属性方法具体解释

    oc为每一个对象提供一个内部计数器.这个计数器跟踪对象的引用计数,当对象被创建或拷贝时.引用计数为1.每次保持对象时,调用retain接口.引用计数加1.假设不需要这个对象时调用release,引用计 ...

  6. OC 内存管理(retain和release)

    内存管理 retain和release简单使用 #import "Student.h" @implementation Student @synthesize age = _age ...

  7. objective-c 语法快速过(6)内存管理原理

    内存管理基本原理(最重要) 移动设备的内存极其有限(iphone 4内存512M),每个app所能占用的内存是有限制的(几十兆而已). 当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不 ...

  8. OC中的内存管理

    一. 基本原理 1. 什么是内存管理 移动设备的内存极其有限,每个app所能占用的内存是有限制的 当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空间.比如回收一些不需 ...

  9. 内存管理、ARC

    内存管理 一.基本原理 1.什么是内存管理 移动设备的内存极其有限,每个app所能占用的内存是有限制的 当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空间.比如回收一 ...

随机推荐

  1. 面向UI编程思想

    UI编程思想: 模块化+组合 模块化是分解: 组合是合成: https://www.cnblogs.com/feng9exe/p/11044134.html

  2. 梯度提升决策树(GBDT)与XGBoost、LightGBM

    今天是周末,之前给自己定了一个小目标:每周都要写一篇博客,不管是关于什么内容的都行,关键在于总结和思考,今天我选的主题是梯度提升树的一些方法,主要从这些方法的原理以及实现过程入手讲解这个问题. 本文按 ...

  3. JS中的同步异步问题

    <script> /* * JS 是单线程 * 同步 异步 * 常见的异步 * 1.定时器 * 2.事件绑定 * 3.ajax请求(一般的都是异步) * 4.回调函数也可以理解成 异步 * ...

  4. PHP中设置session过期的时间

    如何严格限制session在30分钟后过期!1.设置客户端cookie的lifetime为30分钟:2.设置session的最大存活周期也为30分钟:3.为每个session值加入时间戳,然后在程序调 ...

  5. Linux中搭建FTP服务器

    FTP工作原理 (1)FTP使用端口 [root@localhost ~]# cat /etc/services | grep ftp ftp-data 20/tcp #数据链路:端口20 ftp 2 ...

  6. 安装配置elasticsearch、安装elasticsearch-analysis-ik插件、mysql导入数据到elasticsearch、安装yii2-elasticsearch及使用

    一.安装elasticsearch 获取elasticsearch的rpm:wget https://download.elastic.co/elasticsearch/release/org/ela ...

  7. Python之面向对象新式类和经典类

    Python之面向对象新式类和经典类 新式类和经典类的继承原理: 在Python3中,就只有新式类一种了. 先看Python3中新式类: 类是有继承顺序的: Python的类是可以继承多个类的,也就是 ...

  8. LeetCode(47)Permutations II

    题目 Given a collection of numbers that might contain duplicates, return all possible unique permutati ...

  9. allegro中出光绘文件遇到问题的解决办法

    一:设置好光绘文件参数后,选择check dabase before artwork后,点击生成光绘时出现错误告警信息:    database has errors:artwork generati ...

  10. C51 矩阵按键 个人笔记

    矩阵按键 电路 每个按键一端和同行一端相连(JP4的高4位),另一端和同列一端相连(JP4的低4位) 判断按键是否按下: 法一:逐行扫描 for(int i = 8 ; i>3 ; i-- ) ...