文档章节

内存管理一

langzhouzhou1
 langzhouzhou1
发布于 2016/03/18 01:21
字数 659
阅读 59
收藏 2

自从有了ARC很多朋友都忽略了MRC的重要性,ARC并不是万能的,在你使用C底层框架的时候还是需要理解MRC的,至少需要知道简单的使用。

先说说MRC下的几个属性定义的关键字:

retain:类似ARC下的strong引用计数+1.

assign:用于基本数据类似赋值,非oc对象,不对引用计数操作。

copy:用于类似NSString这类的。

这里创建了一个testModel来进行讲解。

retain引用计数+1,release引用计数-1.

TestModel.h

@property(nonatomic,copy)NSString * myName;

TestModel.m

复写Delloc,因为是继承与NSObject所有还要调用一下父类的dealloc。

- (void)dealloc
{
    NSLog(@"Model1被释放了");
    [super dealloc];
}

ViewController.m

@interface ViewController ()
{
    TestModel * _testModel1;
}
- (void)viewDidLoad {
    [super viewDidLoad];

    _testModel1 = [[TestModel alloc]init];
    [_testModel1 retain];
    NSLog(@"1引用计数为%lu",(unsigned long)[_testModel1 retainCount]);
    
    [_testModel1 release];
    NSLog(@"2引用计数%lu",[_testModel1 retainCount]);
    _testModel1.myName = @"Bob";
    
    NSLog(@"name:%@",_testModel1.myName);
    NSLog(@"3引用计数%lu",[_testModel1 retainCount]);
    
    [_testModel1 release];
    
}

//打印结果
1引用计数为2
2引用计数1
name:Bob
3引用计数1
Model1被释放了
//这样应该就很简单的看懂了retain和release的用法了

Xcode还有一个功能可以检查内存管理的问题,也就是zombie。

Product-->Scheme-->Edit Scheme-->勾选Enable Zombie Objects.

这个时候我们可以验证一下

#import "ViewController.h"
#import "TestModel.h"
@interface ViewController ()
{
    TestModel * _testModel1;
}

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    _testModel1 = [[TestModel alloc]init];
    [_testModel1 retain];
    NSLog(@"1引用计数为%lu",(unsigned long)[_testModel1 retainCount]);
    
    [_testModel1 release];
    NSLog(@"2引用计数%lu",[_testModel1 retainCount]);
    _testModel1.myName = @"Bob";
    
    NSLog(@"name:%@",_testModel1.myName);
    NSLog(@"3引用计数%lu",[_testModel1 retainCount]);
    
    [_testModel1 release];
    _testModel1.myName = @"Mary";
    
}

看以上代码,可以看出_testModel1的引用计数已经为0了,而我却还对他的属性赋值,只是在对一个僵尸内存进行操作会报错。

那有盆友就会想那我在给retain不就复活了?然而要明白人死不能复生,你再怎么给他引用计数+1都没用,因为系统会自动将引用计数为0的内存释放了,所以他已经不存在了。

那就有盆友想象,那为了保证我的引用计数最后是为0,那就多release几次的,干净点,那就来试试吧。

#import "ViewController.h"
#import "TestModel.h"
@interface ViewController ()
{
    TestModel * _testModel1;
}

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    _testModel1 = [[TestModel alloc]init];
    [_testModel1 retain];
    NSLog(@"1引用计数为%lu",(unsigned long)[_testModel1 retainCount]);
    
    [_testModel1 release];
    NSLog(@"2引用计数%lu",[_testModel1 retainCount]);
    _testModel1.myName = @"Bob";
    
    NSLog(@"name:%@",_testModel1.myName);
    NSLog(@"3引用计数%lu",[_testModel1 retainCount]);
    
    [_testModel1 release];
    [_testModel1 release];
    
}

然而事与愿违还是报错了

事实证明不可以对一个已经释放的内存进行任何操作。

© 著作权归作者所有

上一篇: 数据结构之链表
下一篇: 多线程
langzhouzhou1
粉丝 5
博文 132
码字总数 64506
作品 0
杭州
私信 提问
rt-thread的小内存管理算法分析

rt-thread的小内存管理是rt-thread操作系统默认堆内存管理算法,是一种简单的内存分配算法,当有可用的内存的时候,会从中分割一块来作为分配的内存,而剩下的则返回到动态内存堆中.此算法采用了...

长平狐
2013/03/19
1K
0
Virtual Machine

虚拟机 关于内存 CPU通过总线来管理内存, 总线分为3种 控制总线: 指定对内存进行的是读还是写操作 地址总线: 用来表示内存中的地址, 一根地址电线对应一个0|1bit, 如果有4根线, 则CPU对内存的...

megachen
2018/06/08
0
0
OC 内存管理-----MRC(手动释放内存)

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

尘埃眠于光年yr
2015/10/16
122
0
cocos2d-x学习之自动内存管理和常见宏

1.自动内存管理 1)概述 C++语言默认是没有提供自动内存管理的。使用者需要自己分配,自己释放。在cocos2d-x里提供了一个自动内存管理的方案。主要是通过CCObject来提供的,用户只要继承了C...

长平狐
2012/08/29
819
0
C++ 面试题~Windows内存管理的方法

//联系人:石虎 QQ:1224614774 昵称:嗡嘛呢叭咪哄 一、虚拟内存的概念 当程序运行时需要从内存中读出这段程序的代码。代码的位置必须在物理内存中才能被运行,由于现在的操作系统中有非常多的...

石虎132
2018/02/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

自建redis笔记

自建redis笔记 最近在linux安装了一下redis,特做一些笔记! 本文先单节点启动redis,然后再进行持久化配置,在次基础上,再分享搭建主从模式的配置以及Sentinel 哨兵模式及集群的搭建 单节点...

北极之北
13分钟前
1
0
vue+element之多表单验证

方法一:利用promise var p1=new Promise(function(resolve, reject) { this.$refs[form1].validate((valid) => { if(valid){ ......

沉迷代码我爱学习
15分钟前
1
0
golang 1.13 errors 包 新函数介绍

引 这次 errors 包算重量级更新。很有更能把以前的一些设计模式给推到。下面聊下用法。 error 装包 以前返回一个错误,想要保存 error 链,还要定义结构体保存以前的 error 信息。感兴趣看下...

guonaihong
24分钟前
38
0
并发编程之线程池

一、线程池 1、什么是线程池 Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序 都可以使用线程池。在开发过程中,合理地使用线程池能够带来3个好处。 第一:降...

codeobj
26分钟前
3
0
知识点总结思维导图模板分享,良心安利,建议收藏

思维导图经常被用在学习中,对大脑思维进行发散,对知识进行记忆。使用思维导图可以让知识更加简单更有层次。下面是利用思维导图所绘制的几款知识点总结思维导图模板,大家可以进行进行参考使...

干货趣分享
30分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部