文档章节

内存管理二

langzhouzhou1
 langzhouzhou1
发布于 2016/03/18 13:12
字数 612
阅读 35
收藏 1

用生活中的例子来说下应该会好理解点。

有人两张桌子,可以看成是两个对象,可以吧使用桌子的人理解为引用计数。

一号桌子上有4个人,2号桌有1个人,这个时候2号桌的人叫一号桌的人来一个玩啊,那一号桌就只有3个人,2号桌有2个人,这样应该就是明白了。

不能同时持有两个对象,你不可能坐在1号桌又坐在2号桌上,所以当你持有了一个新的对象的时候,要对旧的进行release。

Demo;

就自己写set get把,看起来清楚点。

ViewController.m

- (void)viewDidLoad {
    [super viewDidLoad];
    Dog * dog = [[Dog alloc]init];
    dog.age = 10;
    Person * person = [[Person alloc]init];
    
    [person setDog:dog];
    [dog release];
    dog = nil;//防止野指针
    
    NSLog(@"%d",person.dog.age);
    [person release];
    
    person = nil;
}

Dog.h

#import <Foundation/Foundation.h>

@interface Dog : NSObject
{
    int _age;
}

- (void)setAge:(int)age;
- (int)age;
@end

Dog.m

#import "Dog.h"

@implementation Dog
- (void)setAge:(int)age
{
    _age = age;
}

- (int)age
{
    return _age;
}

-(void)dealloc
{
    NSLog(@"狗被销毁了");
    [super dealloc];
}
@end

Person.h

#import <Foundation/Foundation.h>
#import "Dog.h"
@interface Person : NSObject
{
    Dog * _dog;
}

- (void)setDog:(Dog *)dog;
- (Dog *)dog;
@end

Person.m

#import "Person.h"

@implementation Person

- (void)setDog:(Dog *)dog
{
    _dog = dog;
}

- (Dog *)dog
{
    return _dog;
}
@end

如上代码就算是一个简单的多对象的内存管理问题了,如下图

这个人也想拥有这条狗,这时候狗本身就在创建对象alloc的时候被持有数已经为1了,而这个时候有一个人也拥有了狗这个对象,引用计数却不变。这个时候就会有一问题,当dog这个对象不要这条狗了,也就是被release了,那这条狗的引用计数就变为0 了,没人要的狗当然要被销毁了。

虽然人也拥有这个条狗,可是引用计数没变,也就是根本没人知道他也拥有这条狗。所以这个时候需要让系统知道这条狗还有用武之地。

Person.m

#import "Person.h"

@implementation Person

- (void)setDog:(Dog *)dog
{
    _dog = [dog retain];
}

- (Dog *)dog
{
    return _dog;
}

这样就没问题了。

那什么时候这个狗应该要被销毁呢?

当人也不在了,那狗肯定要被销毁,记住一个原则,谁reatin就谁来release

Person.m

#import "Person.h"

@implementation Person

- (void)setDog:(Dog *)dog
{
    _dog = [dog retain];
}

- (Dog *)dog
{
    return _dog;
}

- (void)dealloc
{
    [_dog release];
    NSLog(@"人被销毁了");
    [super dealloc];
}
@end

打印结果
10
狗被销毁了
人被销毁了

只要人还活着 狗就有人要。

© 著作权归作者所有

上一篇: 内存管理三
下一篇: 数据结构之链表
langzhouzhou1
粉丝 4
博文 127
码字总数 62039
作品 0
杭州
私信 提问
C语言内存管理内幕(二)----半自动内存管理策略

C语言内存管理内幕(二)----半自动内存管理策略

张波
2009/04/26
116
0
深入理解Linux内存管理-之-目录导航

转自:https://blog.csdn.net/gatieme/article/details/52384965 1 内存描述 2 页表管理 3 初始化内存管理

zwfgogo
2018/04/20
0
0
轻量级操作系统FreeRTOS的内存管理机制(三)

本文由嵌入式企鹅圈原创团队成员朱衡德(HunterZhu)供稿。 轻量级操作系统FreeRTOS的内存管理机制(二)中讲到,heap2.c的内存管理机制会导致内存碎片的问题,系统运行久后会出现无法分配大...

yueqian_scut
2017/05/04
0
0
十一步让你理解linux的内存映射

零:32位操作系统只有4G的虚拟地址空间,linux将最上的1G用于内核虚拟地址。 一:linux将物理内存完全一一映射到内核空间,这样很方便管理内存,任何页面的虚拟地址减去一个0xc0000000的偏移...

晨曦之光
2012/04/10
193
0
OC 内存管理-----MRC(手动释放内存)

IOS的内存管理 1.再IOS中对于每一个对象都会有一个对象计数器 2.IOS内存管理分为三种(MRC:手动释放内存 autorelaese:自动释放内存 ARC:自动引用计数) (1)MRC 黄金法则: 一旦对象被创建(new...

尘埃眠于光年yr
2015/10/16
122
0

没有更多内容

加载失败,请刷新页面

加载更多

Nervos CKB 脚本编程简介[1]:验证模型

CKB 脚本编程简介[1]: 验证模型 本文作者:Xuejie 原文链接:Introduction to CKB Script Programming 1: Validation Model 本文译者:Jason,Orange 译文链接:https://talk.nervos.org/t/c...

NervosCommunity
38分钟前
6
0
消息中间件——RabbitMQ的高级特性

前言 前面我们介绍了RabbitMQ的安装、各大消息中间件的对比、AMQP核心概念、管控台的使用、快速入门RabbitMQ。本章将介绍RabbitMQ的高级特性。分两篇(上/下)进行介绍。 消息如何保障100%的...

Java架构师ya七
今天
9
0
如何编写高质量的 JS 函数(1) -- 敲山震虎篇

本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/7lCK9cHmunvYlbm7Xi7JxQ 作者:杨昆 一千个读者,有一千个哈姆雷特。 此系列文章将会从函数的执行机制、鲁棒性、函...

vivo互联网技术
今天
7
0
学会这5个Excel技巧,让你拒绝加班

在网上,随处都可以看到Excel技巧,估计已看腻了吧?但下面5个Excel技巧会让你相见恨晚。关键的是它们个个还很实用 图一 技巧1:快速删除边框 有时当我们处理数据需要去掉边框,按Ctrl+Shif...

干货趣分享
今天
11
0
JS基础-该如何理解原型、原型链?

JS的原型、原型链一直是比较难理解的内容,不少初学者甚至有一定经验的老鸟都不一定能完全说清楚,更多的"很可能"是一知半解,而这部分内容又是JS的核心内容,想要技术进阶的话肯定不能对这个...

OBKoro1
今天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部