【IOS学习基础】内存管理
1、内存几大区域
2、引用计数器
3、关于dealloc方法
4、僵尸对象、野指针、空指针。
// 先开启僵尸对象检测 NSObject *obj = [[NSObject alloc] init];
[obj release];
// 野指针错误
[obj log:@"测试"];
// 输出台打印
2016-01-21 19:35:46.367 内存管理[2688:205046] *** -[NSObject log:]: message sent to deallocated instance 0x100113c80 (向一个已经被释放的实例对象发送了消息)
5、开发中关于ARC(自动内存管理)和MRC(手动内存管理)的常用操作
6、关于nil、Nil、NULL
7、@property参数
8、NSString在内存管理中的问题
// 最近在网上视频上看到的一个有趣的问题,按照视频上所讲 // 字符串有一个常量池
// 如果你需要的字符串在常量池中已经存在了,不会分配内存空间
// 使用字符串的时候:采用下面1、3、5方式获取的字符串都在常量区(嗯,这三个NSString对象跟视频上讲的一样,确实在字符常量区,因为打印其引用计数是一个巨大的数,所以判断其内存不归用户管) // 注意:视频上所讲,str2和str4的应该被分配在堆区,即内存归用户管,引用计数应该为1
// 但事实上,看下面打印的str2和str4?瞬间凌乱了,Why,说好的在堆区呢? NSString *str1 = @"abc";
NSString *str2 = [NSString stringWithFormat:@"aaa"];
NSString *str3 = [NSString stringWithString:@"abc"];
NSString *str4 = [[NSString alloc] initWithFormat:@"aaa"];
NSString *str5 = [[NSString alloc] initWithString:@"abc"];
NSString *str6 = [[NSString alloc] init]; // 在栈区?为啥它的引用计数那么大?
NSLog(@"str1 = %@ , %p , %lu",str1,str1,str1.retainCount);
NSLog(@"str2 = %@ , %p , %lu",str2,str2,str2.retainCount);
NSLog(@"str3 = %@ , %p , %lu",str3,str3,str3.retainCount);
NSLog(@"str4 = %@ , %p , %lu",str4,str4,str4.retainCount);
NSLog(@"str5 = %@ , %p , %lu",str5,str5,str4.retainCount);
NSLog(@"str6 = %@ , %p , %lu",str6,str6,str5.retainCount); // 打印
2016-01-21 21:26:36.979 NSString内存管理问题[3269:255674] str1 = abc , 0x100004230 , 18446744073709551615
2016-01-21 21:26:36.980 NSString内存管理问题[3269:255674] str2 = aaa , 0x61616135 , 18446744073709551615
2016-01-21 21:26:36.981 NSString内存管理问题[3269:255674] str3 = abc , 0x100004230 , 18446744073709551615
2016-01-21 21:26:36.981 NSString内存管理问题[3269:255674] str4 = aaa , 0x61616135 , 18446744073709551615
2016-01-21 21:26:36.981 NSString内存管理问题[3269:255674] str5 = abc , 0x100004230 , 18446744073709551615
2016-01-21 21:26:36.981 NSString内存管理问题[3269:255674] str6 = , 0x7fff7c51bd00 , 18446744073709551615
// 然后说在IOS项目下又不一样,我姑且又试了一试,确实是内存地址不一样了,但是引用计数是什么鬼
2016-01-21 21:30:42.632 NSString内存管理[3289:257683] str1 = abc , 0x106f4c050 , 18446744073709551615
2016-01-21 21:30:42.633 NSString内存管理[3289:257683] str2 = aaa , 0xa000000006161613 , 18446744073709551615
2016-01-21 21:30:42.633 NSString内存管理[3289:257683] str3 = abc , 0x106f4c050 , 18446744073709551615
2016-01-21 21:30:42.633 NSString内存管理[3289:257683] str4 = aaa , 0xa000000006161613 , 18446744073709551615
2016-01-21 21:30:42.633 NSString内存管理[3289:257683] str5 = abc , 0x106f4c050 , 18446744073709551615
2016-01-21 21:30:42.633 NSString内存管理[3289:257683] str6 = , 0x107279380 , 18446744073709551615
// 最后,我不死心,又试了一下
NSArray *array1 = [[NSArray alloc] init];
NSLog(@"array1 = %lu",array1.retainCount);
NSMutableArray *array2 = [[NSMutableArray alloc] init];
NSLog(@"array2 = %lu",array2.retainCount);
// 打印
2016-01-21 21:48:01.828 NSString内存管理问题[3447:267148] array1 = 2 // 妈蛋 为什么是2
2016-01-21 21:48:01.828 NSString内存管理问题[3447:267148] array2 = 1
// 最后
看到最后,有这么一张图
总结一下吧,不要相信retainCount的值。(不要用它去做判断)
平常都在用ARC,也没注意到有这些问题,既然看到了,就权当了解一下。
【IOS学习基础】内存管理的更多相关文章
- iOS学习之内存管理
1.1 引用计数 Reference Count 1.2 自动引用计数,ARC(Automatic Reference Counting) 1引用计数 引用计数(Reference Count)是一个 ...
- 【IOS学习基础】NSObject.h学习
一.<NSObject>协议和代理模式 1.在NSObject.h头文件中,我们可以看到 // NSObject类是默认遵守<NSObject>协议的 @interface N ...
- 【OC语法快览】四、基础内存管理
Basic Memory Management 基础内存管理 If you're w ...
- iOS夯实:内存管理
iOS夯实:内存管理 文章转自 内存管理 最近的学习计划是将iOS的机制原理好好重新打磨学习一下,总结和加入自己的思考. 有不正确的地方,多多指正. 目录: 基本信息 旧时代的细节 新时代 基本信息 ...
- IOS开发的内存管理
关于IOS开发的内存管理的文章已经很多了,因此系统的知识点就不写了,这里我写点平时工作遇到的疑问以及解答做个总结吧,相信也会有人遇到相同的疑问呢,欢迎学习IOS的朋友请加ios技术交流群:190956 ...
- IOS开发小记-内存管理
关于IOS开发的内存管理的文章已经很多了,因此系统的知识点就不写了,这里我写点平时工作遇到的疑问以及解答做个总结吧,相信也会有人遇到相同的疑问呢,欢迎学习IOS的朋友请加ios技术交流群:190956 ...
- java虚拟机学习-JVM内存管理:深入垃圾收集器与内存分配策略(4)
Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 说起垃圾收集(Garbage Collection,下文简称GC),大部分人都把这项 ...
- java虚拟机学习-JVM内存管理:深入Java内存区域与OOM(3)
概述 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 对于从事C.C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝又 ...
- [转载]对iOS开发中内存管理的一点总结与理解
对iOS开发中内存管理的一点总结与理解 做iOS开发也已经有两年的时间,觉得有必要沉下心去整理一些东西了,特别是一些基础的东西,虽然现在有ARC这种东西,但是我一直也没有去用过,个人觉得对内存操作 ...
- OC基础 内存管理
OC基础 内存管理 我们所了解的c语言内存管理,如下: (1)c语言的内存分配:char *p = (char*)malloc(100*sizeof(char)); (2)c语言的内存释放:free ...
随机推荐
- tail
tail用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理.常用查看日志文件. -f 循环读取 -q 不显示处理信息 -v 显示详细的处理信息 -c<数目> 显示的字节数 -n& ...
- 解决 Visual Studio 2012 有时不能调试的问题
有时候发现 Visual Studio 2012 不能调试,有时候又能调试.感觉很烦,今天找到了一个解决办法,我也不知道为什么这样能解决. 问题: 解决:1. 找到 Properties ,双击 2. ...
- jQuery.on() 函数详解
on() 函数用于为指定元素的一个或多个事件绑定事件处理函数. 此外,你还可以额外传递给事件处理函数一些所需的数据. 从jQuery 1.7开始,on()函数提供了绑定事件处理程序所需的所有功能,用于 ...
- HDU 1088 - Write a simple HTML Browser
直接看sample input = = 又一道模拟. #include <iostream> #include <string> #include <cstdio> ...
- HDU 1151 - Air Raid
很明显求最小路径覆盖 就是求最大匹配 #include <iostream> #include <cstdio> #include <cstring> #inclu ...
- [转载]CodeBlocks+wxWidgets
到www.CodeBlocks.org下载并安装CodeBlocks,最好下载MinGW版本的,可以省掉安装和配置GCC的麻烦. 到www.wxWidgets.org下载并安装wxWidgets,如果 ...
- HTML5的结构学习(2) --- 新增的非主体结构元素
除了上一篇学习到的主体结构元素之外,html5还增加了一些表示逻辑结构和附加信息的非主体结构元素: 1.header 解释:一种具有引导和导航作用的结构元素. 用途:通常用来放置整个页面或者页面内某一 ...
- 从苹果的appstore谈谈web前端那丝毫的追求
献上链接:点击进入itunes打开页面,我们先找到App 的logo图比如这个图很简单的一个图标,估计多数人选择的是上传一张处理好圆角,border的图片作为app logo,但问题是苹果觉得,你们每 ...
- Python zxing 库解析(条形码二维码识别)
各种扫码软件 最近要做个二维码识别的项目,查到二维码识别有好多开源的不开源的软件 http://www.oschina.net/project/tag/238/ Zbar 首先试了一下Zbar,pyt ...
- 使用 phpMailer 基于(SMTP) 发送邮件
PHPMailer是一个用于发送电子邮件的PHP函数包.它提供的功能包括:在发送邮时指定多个收件人,抄送地址,暗送地址和回复地址.支持多种邮件编码包括:8bit,base64,binary和quote ...