Objective-C的内存管理
一、Objective-C内存管理的对象
1. 值类型:比如int、float、struct等基本数据类型。
- 值类型会被放入栈中,在内存中占有一块连续的内存空间,遵循先进后出的原则,故不会产生碎片。
- 由系统分配管理
2. 引用类型:Objective-C的对象
- 引用类型会被放到堆中,内存分配按照一定的分配算法,但无论算法多优,总会产生碎片。
- 内存的分配和释放由程序员操作管理
3. 值类型和引用类型之间的相互转化
- 装箱:把值类型转化为引用类型的过程叫做装箱,如把int包装为NSNumber。
- 拆箱:把引用类型转为值类型的过程叫做拆箱,如把NSNumer转为int。
二、Objective-C内存管理的对象的方法
1. 引用计数
- 表示对象被引用的次数,通过它可以判断对象是否被回收。
- 如果引用计数为0,对象回收,不为0则不回收。
- 当对象执行alloc、new、copy或者retain时,引用计数加1,release时,引用计数减1。
三、Objective-C管理内存的方式
1. 手动内存管理机制:MRC
- MRC模式下,所有的对象都需要手动的添加retain、release代码来管理内存。
- 使用MRC,需要遵守谁创建,谁回收的原则。也就是谁alloc,谁release;谁retain,谁release。
- 当引用计数为0的时候,必须回收,引用计数不为0,不能回收,如果引用计数为0,但是没有回收,会造成内存泄露。如果引用计数为0,继续释放,会造成野指针。为了避免出现野指针,我们在释放的时候,会先让指针置为nil。
2. 自动内存管理机制:ARC
1)ARC模式下的property变量修饰词
- 强引用strong:相当于retain,使用之后,计数器值+1。
- 弱引用weak:相当于assign,使用不会改变计数器的值,指针指向的地址被释放后,会自动置为nil。
- retain:引用计数值+1,即对象持有者的个数+1。
- assign:设置变量时使用,不设计引用计数。
- copy:拷贝对象。
- readwrite与readonly:限制访问者的权限。
- atomic与nonatomic:原子操作与非原子操作。原子操作适用于多线程,对共享资源的安全访问。非原子操作多用于非多线程,可以提高性能。
2)自动释放池
自动内存释放使用@autoreleasepool关键字声明一个代码块,如果一个对象在初始化时调用了autorelase方法,那么当代码块执行完之后,在块中调用过autorelease方法的对象都会自动调用一次release方法。这样一来就起到了自动释放的作用,同时对象的销毁过程也得到了延迟(统一调用release方法)。
- autorelease方法不会改变对象的引用计数器,只是将这个对象放到自动释放池中;
- 自动释放池实质是当自动释放池销毁后调用对象的release方法,不一定就能销毁对象(例如如果一个对象的引用计数器>1则此时就无法销毁);
- 由于自动释放池最后统一销毁对象,因此如果一个操作比较占用内存(对象比较多或者对象占用资源比较多),最好不要放到自动释放池或者考虑放到多个自动释放池;
- ObjC中类库中的静态方法一般都不需要手动释放,内部已经调用了autorelease方法;
Objective-C的内存管理的更多相关文章
- Objective C内存管理之理解autorelease------面试题
Objective C内存管理之理解autorelease Autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的A ...
- Objective -C Memory Management 内存管理 第一部分
Objective -C Memory Management 内存管理 第一部分 Memory management is part of a more general problem in pr ...
- Objective C 内存管理[转]
1 配对原则 alloc – release new – release retain - release copy – release 2 new和alloc-init的区别 (1)区别只在于a ...
- Objective-C(内存管理)
引用计数器 每个OC对象都有一个占4个字节存储空间的引用计数器 当使用或创建一个对象时,新对象的引用计数器默认是1 retain:可以使引用计数器+1 release:可以是引用计数器-1 retai ...
- objective C 内存管理及属性方法具体解释
oc为每一个对象提供一个内部计数器.这个计数器跟踪对象的引用计数,当对象被创建或拷贝时.引用计数为1.每次保持对象时,调用retain接口.引用计数加1.假设不需要这个对象时调用release,引用计 ...
- IOS学习笔记3—Objective C—简单的内存管理
今天简述一下简单的内存管理,在IOS5.0以后Apple增加了ARC机制(Automatic Reference Counting),给开发人员带来了不少的方便,但是为了能更好的理解IOS内存管理机制 ...
- objective-c(内存管理)
本文主要记录objective-c 内存管理的知识点: 1.objective-c的对象都是分配内存在堆上,与C的mallock和C++的new类似,只有int等系统变量分配内存在栈上: 2.obje ...
- iOS学习17之OC内存管理
1.内存管理的方式 1> iOS应用程序出现Crash(闪退),90%的原因是因为内存问题. 2> 内存问题 野指针异常:访问没有所有权的内存,如果想要安全的访问,必须确保空间还在 内存泄 ...
- iOS - OC 内存管理
1.OC 基本内存管理模型 1.1 自动垃圾收集 在 OC 2.0 中,有一种称为垃圾收集的内存管理形式.通过垃圾收集,系统能够自动监测对象是否拥有其他的对象,当程序执行需要空间的时候,不再被引用的对 ...
- Objective-C----MRC内存管理 、 自动释放池 、 面向对象三大特性及封装 、 继承 、 组合与聚合
1 MRC练习 1.1 问题 引用计数是Objective-C语言采用的一种内存管理技术,当一个对象被创建在堆上后,该对象的引用计数就自动设置为1,如果在其它对象中的对象成员需要持有这个对象时,则该对 ...
随机推荐
- 安卓集成发布详解(二)gradle
转自:http://frank-zhu.github.io/android/2015/06/15/android-release_app_build_gradle/ 安卓集成发布详解(二) 15 Ju ...
- 【VNC】Ubuntu14.04LTS下安装VNC View
# apt-get install tightvncserver vnc4server gnome-panel gnome-settings-daemon metacity nautilus gnom ...
- Python 从sketch中读取文件
=============================== RESTART: Shell =============================== >>> import o ...
- Add 1G to a LVM on VMware
1. update disk1 to 5G from 4G in vcenter2. echo 1 > /sys/block/sda/device/rescan3. fdisk /dev/sda ...
- 一个快速、完善的Android开发框架整合实践(QuickAndroid)
https://github.com/alafighting/QuickAndroid QuickAndroid 一个快速.完善的Android开发框架整合实践 QA项目简介 本框架QuickAndr ...
- VBA相关
--能否彻底隐藏某行或某列 用代码隐藏列,将其放在Private Sub Worksheet_SelectionChange(ByVal Target As Range)Columns(1).Enti ...
- nand flash,nor flash,spi flash,片上RAM,片外RAM
Flash有掉电数据保存的特点,RAM掉电则数据丢失,但是RAM的速度更高,擦写次数理论上没有限制,而Flash则不行. Nand Flash相比其余的几种flash优势在于可擦写次数多,擦写速度快, ...
- 黄聪:如何添加360浏览器(chrome)添加JavaScript例外,禁止网站加载JS
注意:通配符两侧的[]不能省略
- 在JavaScript里嵌入大量字符串常量的方法
[转]在JavaScript文件里嵌入大量字符串常量是经常遇到的事.有时为了省事,就把一些界面的HTML和CSS直接写在JS文件里.数量少还好,多的话就密密麻麻的一坨文字,讲究美观的文艺青年们,会用大 ...
- 转-WebView loadData与loadDataWithBaseURL用法、区别
近期用到WebView加载一些动态的内容的时候遇到一些问题,例如:在加载动态网页时,页面有很多样式表包含一些特殊字符,导致WebView无法识别产生加载异常,程序直接崩溃:另外一个就是加载的网页中有图 ...