iOS 非ARC基本内存管理系列 2-多对象内存管理(1)
单个对象的内存管理非常简单无非就是alloc对应release,retain对应release。但是如果涉及到很多对象,而且对象与对象有联系的时候该怎么去管理对象的内存呢。
比如同样一本书有好3个人购买,那意味着3个人都在引用这本书。在内存中如图所示:

那么如果Person对象引用Book对象的话就必须给Book对象的引用计数+1,如果不再引用Book对象就要把Book对象中的引用计数减1。遵循"有加必有减"
1.多对象内存管理原则分析
- 只要还有人在使用某个对象,那么这个对象就不会被回收
- 只要你想用这个对象,就让对象的计数器+1
- 当你不再使用这个对象时,就让对象的计数器-1
- 只要有人在使用书,那书就不会释放
2.谁创建谁release
如果通过alloc、new或[mutable]copy来创建一个对象,那么必须调用release或autorelease
换句话说,不是你创建的,就不用你去[auto]release
3.谁retain谁release
只要你调用了retain,无论这个对象是如何生成的,你都要调用release
4.总结原则
- 有始有终,有加就有减
- 曾经让对象的计数器+1,就必须在最后让对象计数器-1
5.代码实现
/* 需求:有连个类Person类和Book类,实现让Person类获取到Book,也就是人要获取书;
如果Person类对象释放那么Book类对象也必须释放,也就是说一旦人没了,书也就没了 设计类:既然人要占有书,那么可以在人中包含一个书类型,然后让实际的书给人中的书赋值那么人就拥有书了 */
内存结构如图:

代码实现:
/********************************** Person.h文件 *********************************/ #import "Book.h"
#import <Foundation/Foundation.h> @interface Person : NSObject
{
// 既然人要拥又书,那么在Person类定义一个Book类型的成员变量 _book
Book *_book;
} // @property会隐藏底层内存管理 因此先不使用@property便于查看底层实现
// @property Book *book; // 通过set方法为Person中的_book传入实际的book
- (void)setBook:(Book *)book; - (Book *)book; @end /********************************** Person.m文件 *********************************/ #import "Person.h" @implementation Person // 为Person中的_book传入Book对象 类似于给了Person中的_book给了一本书
- (void)setBook:(Book *)book
{
// 既然人已经拥有了书 那么书的引用计数必须+1 因此调用书的retain方法
_book = [book retain];
NSLog(@"人拥有书了");
} - (Book *)book
{
return _book;
} // Person类对象在回收前调用方法
- (void)dealloc
{
[_book release];
NSLog(@"Person对象被回收"); [super dealloc];
} @end /********************************** Book.h文件 *********************************/ #import <Foundation/Foundation.h> @interface Book : NSObject
@end /********************************** Book.m文件 *********************************/ #import "Book.h" @implementation Book // Book类对象在回收前调用方法
- (void)dealloc
{
NSLog(@"Book对象被回收"); [super dealloc];
} @end /********************************** main文件 *************************************/ #import <Foundation/Foundation.h>
#import "Book.h"
#import "Person.h" int main(int argc, const char * argv[])
{
Person *p = [[Person alloc] init]; Book *b = [[Book alloc] init]; // 为Person类对象中的_book传入实际的Book对象
[p setBook:b]; // 释放Person类对象
[p release]; // 既然Person类对象已经释放那么清除掉指向Person类对象的指针
p = nil; // 既然Person类已经不可用了那么Book类对象也应该释放
[b release]; // 清空指向Book类对象的指针
b = nil; return ;
}
iOS 非ARC基本内存管理系列 2-多对象内存管理(1)的更多相关文章
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(10)- VSS源代码管理
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(10)- VSS源代码管理 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 ( ...
- iOS 非ARC基本内存管理系列 -手把手教你ARC——iOS/Mac开发ARC入门和使用(转)
手把手教你ARC——iOS/Mac开发ARC入门和使用 Revolution of Objective-c 本文部分实例取自iOS 5 Toturail一书中关于ARC的教程和公开内容,仅用于技术交流 ...
- iOS 非ARC基本内存管理系列 2-多对象内存管理(3) 利用@property来自动管理内存
iOS 基本内存管理-多对象内存管理(2)中可以看到涉及到对象的引用都要手动管理内存:每个对象都需要写如下代码 // 1.对要传入的"新车"对象car和目前Person类对象所拥有 ...
- iOS 非ARC基本内存管理系列总结6 -设计微博模型
设计简单的微博模型:用User类和Status类来模拟实现 在非ARC机制下有两种方式,两者没有太大的区别之所以写了两种只是为了方便学习和对比两种写法! 第一种:没有使用atuorelease和自动释 ...
- iOS 非ARC基本内存管理系列 2-多对象内存管理(2)
/* 多对象内存管理: 以人拥有车为例涉及到@property底层set方法管理内存的实现 注意:人在换车的时候要进行当前传入的车和人所拥有的车进行判断 */ /******************* ...
- iOS 非ARC基本内存管理系列 1-引用计数器
1.什么是内存管理 移动设备的内存极其有限,每个app所能占用的内存是有限制的 当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空间.比如回收一些不需要使用的对象.变量 ...
- iOS 非ARC基本内存管理系列 5-autorelease方法使用总结
autorelase:可以将对象交给自动释放池中,释放池销毁的时候对里面的对象做一次release操作代码如下 @autoreleasepool { Person *person = [[[Perso ...
- iOS 非ARC基本内存管理系列 4-autorelease方法和@autoreleasepool
1.autorelease 基本用法 对象执行autorelease方法时会将对象添加到自动释放池中 当自动释放池销毁时自动释放池中所有对象作release操作 对象执行autorelease方法后自 ...
- iOS 非ARC基本内存管理系列 3-循环retain和@class
1.@class 使用场景:对于循环依赖关系来说,比方A类引用B类,同时B类也引用A类: 可以看出Person和Card互相引用,此时如果使用#import编译报错!因此当使用@class在两个类中相 ...
随机推荐
- 使用Active MQ在.net和java系统之间通信
ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现 一.特性列表 ⒈ 多种语言和 ...
- 算法入门系列一--DP初步
数字三角形(数塔问题) 其实动态规划本身并不是一个特定的算法,是一种用途广泛的问题求解方法,一种思想,一种手段. 1.1问题描述与状态定义 有一个有非负整数组成的三角形,第一行一个数字,下面各行除了最 ...
- Javassist初体验
最初接触javassist是在研究dubbo源码的时候,那会对其的理解还停留在动态生成字节码的位置,可以做动态代理之类的动态化处理.最近由于项目需要扫描springMVC中control ...
- 03 InnoDB锁问题
InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION):二是采用了行级锁.行级锁与表级锁本来就有许多不同之处,另外,事务的引入也带来了一些新问题.下面我们先介绍一点背景知识 ...
- 小白日记38:kali渗透测试之Web渗透-手动漏洞挖掘(四)-文件上传漏洞
手动漏洞挖掘 文件上传漏洞[经典漏洞,本身为一个功能,根源:对上传文件的过滤机制不严谨] <?php echo shell_exec($_GET['cmd']);?> 直接上传webshe ...
- 小白日记8:kali渗透测试之主动信息收集(二)三层发现:ping、traceroute、scapy、nmap、fping、Hping
三层发现 三层协议有:IP以及ICMP协议(internet管理协议).icmp的作用是用来实现intenet管理的,进行路径的发现,网路通信情况,或者目标主机的状态:在三层发现中主要使用icmp协议 ...
- Windows Service 之 安装失败后的删除
一个windows服务在卸载之后并不会马上从服务列表中消失掉,而是在服务列表中会显示服务被禁用:这样在你需要再次安装同名服务时,就装不了了,会被提示同名的服务已经存在.如果是在本地安装,这种情况很容易 ...
- Team Queue
Team Queue Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 2471 Accepted: 926 Descrip ...
- oracle中序列的使用
转载:http://blog.csdn.net/java958199586/article/details/7360152 序列: 是oacle提供的用于产生一系列唯一数字的数据库对象. l 自动提 ...
- LeetCode 231
Power of Two Given an integer, write a function to determine if it is a power of two. /************* ...