ios的内存管理

objective-c的内存管理划分是基本类型存储在栈内(栈内被占用的内存由系统自动释放),对象存储在堆内。由于objc没有垃圾回收机制(GC) 不能自动释放堆中的内存,需要程序员自己手动释放,否则会导致内存溢出。objc的内存管理机制主要有:1、引用计数器  2、属性参数  3、自动释放池。
      1、引用计数器
          xcode4.2之后就引入了ARC(Automatic Reference Counting)自动引用计数机制,程序编译时自动给代码添加内存释放代码,因此我们不能再添加释放内存的代码。若想要自己管理内存,则需要将ARC关 闭(在Xcode中关闭ARC:项目属性—Build Settings--搜索“garbage”找到Objective-C Automatic Reference Counting设置为No即可)。
       Objc没有垃圾回收机制,所以Objc的内存管理依赖对象引用计数器来进行的。每个对象在创建之后都有一个与之对应的整数(retainCount),即“引用计数器”。对象在创建之后引用计数器为1,在调用对象的copy、retain、alloc、new之后对象的引用计数器都会在原来的基础上再加1,如果调用这个对象的release就会减1,若引用计数器等于0,则系统会调用这个对象的dealloc方法来释放内存,销毁对象。且秉承着“谁创建,谁释放”原则。
       2、属性参数?
       ?  如:@property(nonatomic,strong)Car *car 这样的属性,没有对其进行手动的getter 和setter的方法也不会导致内存泄露。用到属性@property来定义一个实例变量,这样Xcode将会自动的在相应的.m文件中生成setter和getter方法.属性参数是怎么样管理内存的呢?

我们先看当属性为retain时,它的setter内部如何实现的:

-(void)setName:(NSString)name{

if(_name !=name){

[_name release];//先释放原来的值

_name =[name retain];//新值在retain一次再赋值;

}

}

当属性为copy时,它的setter内部如何实现:

-(void)setName:(NSString)name{

if(_name !=name){

[_name release];//先释放原来的值

_name =[name  copy];

}

}
属性修饰成copy的setter方法内部实现

getter的方法能够延长对象的生命周期,它的内部代码如下:

-(NSString *)name{

return [[_name retain] autorelease];

}

getter方法的更安全的写法

这以上是系统中生成的setter和getter方法,它保证了内存的能够更好更安全的回收
      3、自动释放池?
     在ObjC中也有一种内存自动释放的机制叫做“自动释放池”,这是一种半自动的机制,有些操作需要我们手动设置。自 动内存释放使用@autoreleasepool关键字声明一个代码块,如果一个对象在初始化时调用了autorelase方法,那么当代码块执行完之 后,在块中调用过autorelease方法的对象都会自动调用一次release方法。这样一来就起到了自动释放的作用,同时对象的销毁过程也得到了延 迟(统一调用release方法)。

时间: 2024-09-29 04:50:54

ios的内存管理的相关文章

说说iOS与内存管理(上)

http://www.cocoachina.com/ios/20150625/12234.html 说起内存管理,看似老生常谈,而真正掌握内存管理的核心其实并不简单.ARC/MRR以及“谁分配谁就负责释放”这种基本原则是很重要的,但不是本文要讨论的重点.之前本人还没在小站发过相关的文章,本篇文章中,我本人是想结合实际开发和调试中遇到的一些细节问题,来谈谈iOS的内存管理内在机制和调试方法. 上一篇文章已经是4月份的了,时间飞快又过去了好久,小站5月份没有文章更新,罪过罪过.最近小站的站长我又转换

理解 iOS 的内存管理

理解 iOS 的内存管理 远古时代的故事 那些经历过手工管理内存(MRC)时代的人们,一定对 iOS 开发中的内存管理记忆犹新.那个时候大约是 2010 年,国内 iOS 开发刚刚兴起,tinyfool 大叔的大名已经如雷贯耳,而我还是一个默默无闻的刚毕业的小子.那个时候的 iOS 开发过程是这样的: 我们先写好一段 iOS 的代码,然后屏住呼吸,开始运行它,不出所料,它崩溃了.在 MRC 时代,即使是最牛逼的 iOS 开发者,也不能保证一次性就写出完美的内存管理代码.于是,我们开始一步一步调试

总结 IOS 7 内存管理

[iOS7的一些总结]5.iOS中的内存管理 我们知道,为了更加方便地处理内存管理问题,将开发人员从繁琐的内存的分配和释放工作中解放出来而专注于产品和逻辑,iOS提供了一种有效的方法, 即自动引用计数ARC.采用了ARC之后,绝大部分内存管理的问题就不需要我们继续操心了.但是从另一个方面讲,这个方便的工具也助长了程序员的懒惰情 绪,很多新手和学生甚至连引用计数的含义都不清楚.的确,这部分内容相对比较难以理解,不过如果能深刻地领悟之后将会是未来学习和开发中的强大助推器. 1.关于对象所有权的概念:

iOS之内存管理(ARC)

iOS的内存管理,相信大家都不陌生,之前是使用的MRC,由开发人员手动来管理内存,后来使用了ARC,来由系统管理内存.本文主要讲讲Autorelease,Core Foundation对象在内存管理方面要注意的地方. Autorelease 提到内存管理,就不得不提autorelease,虽然我们平时开发中很少会感知到它的存在.autorelease就是自动释放的意思,如果变量使用autorelease来修饰,就表明变量的释放由系统来完成. autoreleasepool是由runloop在开启

iOS基础 ----- 内存管理

Objective-C 的内存管理方式有引用计数机制,垃圾回收机制,自动释放池.有alloc,就有释放.iOS应?程序出现Crash(闪退),90%的原因是因为内存问 题.在?个拥有数?个甚?是上百个类的?程?,查找内存问 题极其困难,学会内存管理,能帮我们减少出错的?率.内存问题体现在两个??:内存溢出.野指针异常. 引用计数器 在Xcode4.2及之后的版本中由于引入了ARC(Automatic Reference Counting)机制,程序编译时Xcode可以自动给你的代码添加内存释放代

iOS中内存管理

iOS中创建对象的步骤: 1,分配内存空间,存储对象 2,初始化成员变量 3,返回对象的指针地址 第一:非ARC机制: 1,对象在创建完成的同时,内部会自动创建一个引用计数器,是系统用来判断是否回收对象的唯一标示,当我们的应用计数retainCount = 0的时候,系统会回收当前对象2,[对象 release] retainCount - 1:3,[对象 retain] retailCount + 1:4,当应用计数retailCount = 0的对象就会被销毁; 5,dealloc函数,当一

【点杀ios】内存管理

1.为什要进行内存管理 ios中,每个应用程序所能占有的内存是有限制的.如果你的应用程序所占用的内存超过了这个限制,系统会给你发出内存警告.如果警告后你的程序依然继续占用过多内存,那么系统有可能强制关闭你的应用程序(闪退).并且,如果内存管理没做好,对程序的流畅度也会产生很大的影响.所以,我们在开发应用程序的过程中,要进行内存管理. 2.对什么进行管理: 内存分为堆内存和栈内存.栈内存的分配和释放是系统做的,程序员无法参与.而堆内存,是程序员进行管理的.分配和释放是程序员完成的. 任何继承了NS

iOS开发-内存管理

内存管理 对于这篇呢,其实现在都是ARC模式,正常状态下基本不用我们去手动释放内存,所以如果不是要面试呀.装逼或者扎实功底的,就先别看了或者了解下即可,因为像面试时,有些面试官想看你的基础时,就有些人会问,现在工作基本不会用到. 学习目标 1. 掌握内存管理的原理 2. 掌握手动内存管理 =============================================== 1.需要理解的知识 1.1内存管理 1.1.1 C的内存管理,以及麻烦之处 char *p = (char *)m

iOS之“内存管理”篇

什么是内存管理? 内存管理的是堆空间,内存管理的任务:保证开辟的空间能够被正确释放. 内存管理存在的问题?? [内存泄露]开辟的空间未释放. [提前释放]堆空间没有使用完毕,就已经释放了. [重复释放]开辟同一个空间,被释放多次. [注]内存泄露和提前释放短时间内不会造成系统崩溃,但是重复释放直接造成系统崩溃. C语言中内存管理的困境? 必须清楚一块堆空间,到底有几个指针指向,在通过其中一个指针free该空间时,必须保证所有的指针必须使用完毕了,避免[提前释放].而且必须保证只能这些指针中的一个

iOS之内存管理浅谈

1.何为ARC ARC是automatic reference counting自动引用计数,在程序编译时自动加入retain/release.在对象被创建时retain count+1,在对象被release时count-1,当count=0时,销毁对象.程序中加入autoreleasepool对象会由系统自动加 上autorelease方法,如果该对象引用计数为0,则销毁.那么ARC是为了解决MRC手动管理内存存在的一些而诞生的. MRC下内存管理的缺点: 释放一个堆内存时,首先要确定指向这