ios内存管理笔记(一)
objc提供了两种内存管理的方法
1,MRR manual retain-release
2, ARC Automatic Reference Counting
基本的内存管理法则:
1, 拥有任何创建的对象,例如new alloc copy等
2, 可以通过retain来获得对象的控制权
3, 当不再需要对象时必须释放
4, 不能释放没有控制权的对象
上面的例子中使用了alloc来获取了对象的控制权,在失去引用之前必须放弃拥有权。但是如果使用release,那么对象就会在return之前被释放掉,最终返回无效的对象。此处使用autorelease表示你将放弃此控制权但是允许在对象被dealloc之前调用函数使用其返回值。
你也可以使用下面的方法,即不alloc来获取拥有权而是直接返回值也是可以的,例如:
- (NSString *)fullName{
NSString *string = [NSString initWithFormat:@"%@ %@", self.firstName, self.lastName];
return string;
}
但是下面这种方法就是错误的
上面的这种方法,调用函数并不拥有此return的string的值,因此调用函数没有理由去释放返回的string,因此就会造成内存泄漏。所谓的拥有就是说使用alloc new retain等来获得其控制权。
执行dealloc来放弃拥有权
dealloc的调用时机:在对象不再有拥有者并且内存回收时会调用这个方法。dealloc会释放对象的内存并处理其所有的资源包括任何实例对其的所有权
当程序结束后,有可能不会为对象发送dealloc消息。因为进程内存在程序退出后会被自动清除,这样做更为方便。
避免为正在使用的object调用dealloc
使用autorelease pool
Autorelease pool只对于在其作用域内显示使用了autorelease的对象起作用
提供了一种机制,在取消对象时防止立即被销毁。一般不需要创建自己的autorelease pool,但是有一些情况必须或者还是很有必要来创建自己的autorelease pool
在autorelease pool块尾,凡是在块儿内有收到autorelease message的对象都会被发送一个release message
可以嵌套使用
三种情况需要创建自己的autorelease pool
1,基于命令行的程序
2,loop中有过多的临时变量
3,启动子线程
启动线程如果使用posix api而不是NSThread,那么除非cocoa当前项目是多线程否则不能使用cocoa。可以使用ismultithreaded方法来判断是否是多线程
ios内存管理笔记(一)的更多相关文章
- ios内存管理笔记(三)
我们在进行iOS开发时,经常会在类的声明部分看见类似于@synthesize window=_window; 的语句,那么,这个window是什么,_ window又是什么,两个东西分别怎么用,这是一 ...
- ios内存管理笔记(二)
1)实现部分: 复制代码 @synthesize window=_window; @synthesize viewController=_viewController; 通常看到的都没有包含=部分,@ ...
- IOS内存管理学习笔记
内存管理作为iOS中非常重要的部分,每一个iOS开发者都应该深入了解iOS内存管理,最近在学习iOS中整理出了一些知识点,先从MRC开始说起. 1.当一个对象在创建之后它的引用计数器为1,当调用这个对 ...
- iOS内存管理
iOS内存管理的方式是引用计数机制.分为MRC(人式引用计数)和ARC(自动引用计数). 为什么要学习内存管理? 内存管理方式是引用计数机制,通过控制对象的引用计数来实现操作对象的功能.一个对象的生命 ...
- 【Bugly干货分享】iOS内存管理:从MRC到ARC实践
Bugly 技术干货系列内容主要涉及移动开发方向,是由Bugly邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 对于iOS程序员来说,内存管理是入门的 ...
- iOS内存管理个人总结
一.变量,本质代表一段可以操作的内存,她使用方式无非就是内存符号化+数据类型 1.保存变量有三个区域: 1>静态存储区 2>stack 3>heap 2.变量又根据声明的位置有两种称 ...
- iOS内存管理编程指南
iOS 内存管理 目录[-] 一:基本原则 二:成员变量的内存管理 三:容器对象与内存管理 四:稀缺资源的管理 五:AutoRelease 六:其他注意事项 iOS下内存管理的基本思想就是引用计数,通 ...
- iOS内存管理(一)
最近有时间,正好把iOS相关的基础知识好好的梳理了一下,记录一下内存相关方面的知识. 在理解内存管理之前我觉得先对堆区和栈区有一定的了解是非常有必要的. 栈区:就是由编译器自动管理内存分配,释放过程的 ...
- iOS内存管理 ARC与MRC
想驾驭一门语言,首先要掌握它的内存管理特性.iOS开发经历了MRC到ARC的过程,下面就记录一下本人对iOS内存管理方面的一些理解. 说到iOS开发,肯定离不开objective-c语言(以下简称OC ...
随机推荐
- 【Best Time to Buy and Sell Stock II】cpp
题目: Say you have an array for which the ith element is the price of a given stock on day i. Design a ...
- leetcode 【 Best Time to Buy and Sell Stock II 】python 实现
题目: Say you have an array for which the ith element is the price of a given stock on day i. Design a ...
- Visual C++斗地主游戏网络版源代码
说明:VC++ 6.0写的网络版斗地主游戏,程序基于directx SDK开发,因此你在编译时需要引入相应文件才可以,本斗地主可以支持双人对战.网络对战,游戏随机产生地主,动画发牌,界面也不错,还有声 ...
- Leetcode 654.最大二叉树
最大二叉树 给定一个不含重复元素的整数数组.一个以此数组构建的最大二叉树定义如下: 二叉树的根是数组中的最大元素. 左子树是通过数组中最大值左边部分构造出的最大二叉树. 右子树是通过数组中最大值右边部 ...
- SpringCloud Eureka参数配置项详解
SpringCloud Eureka参数配置项详解(转) Eureka涉及到的参数配置项数量众多,它的很多功能都是通过参数配置来实现的,了解这些参数的含义有助于我们更好的应用Eureka的各种功能,下 ...
- File IO(NIO.2):文件操作
简介 Files类是java.nio.file包的另一个主要入口点.该类提供了一组丰富的静态方法,用于读取,写入和操作文件和目录.Files方法适用于Path对象的实例.在进行其余部分之前,您应该熟悉 ...
- JDBC 学习笔记(十二)—— DataSource
在 JDBC 的实现过程中,最消耗资源的从来不是执行 SQL 之类的过程,而是获取-释放 数据库连接 Connection 的过程. 之前通过 DriverManager 获得的数据库连接对象,每一个 ...
- 在iBatis中操作Blob数据类型
这里的Blob数据类型指的是保存了文本的blob数据类型 直接读取blob类型存储的文本,可能会出现乱码,所以需要读取完后进行手动转码 这里使用ibatis作为持久层 SELECT urlconten ...
- mysql再次安装问题
安装过一次mysql的电脑,想再安装或更换其它版本的mysql.在重新安装的最后一步,总会出现这样的问题. 网上说法也很多,什么删除注册表了等等.这都是狗屁. 真正的做法是找到C盘下的隐藏文件夹Pro ...
- codechef May Challenge 2016 CHSC: Che and ig Soccer dfs处理
Description All submissions for this problem are available. Read problems statements in Mandarin Chi ...