iOS技术面试02:内存管理

  1. 怎么保证多人开发进行内存泄露的检查. 如何定位内存泄露?

1> 使用Analyze进行代码的静态分析(检测有无潜在的内存泄露)

2> 通过leak检查在程序运行过程中有无内存泄露

3> 为避免不必要的麻烦, 多人开发时尽量使用ARC

2.非自动内存管理情况下怎么做单例模式.

创建单例设计模式的基本步骤 ·

>声明一个单件对象的静态实例,并初始化为nil。

>创建一个类的类工厂方法,当且仅当这个类的实例为nil时生成一个该类的实例

>实现NScopying协议, 覆盖allocWithZone:方法,确保用户在直接分配和初始化对象时,不会产 生另一个对象。

>覆盖release、autorelease、retain、retainCount方法, 以此确保单例的状态。

>在多线程的环境中,注意使用@synchronized关键字或GCD,确保静态实例被正确的创建和初始化。

3.对于类方法(静态方法)默认是autorelease的。所有类方法都会这样吗?

1> 系统自带的绝大数类方法返回的对象,都是经过autorelease的

4.block在ARC中和MRC中的用法有什么区别,需要注意什么

1.不管是ARC和MRC,block都应该用copy操作来持有

  1. 应注意避免循环引用

1> ARC: __weak、__unscafe_unretained

2> MRC:__block

5.什么情况下会发生内存泄漏和内存溢出?

1> 内存泄露:该释放的没有释放。内存泄露堆积后果很严重,无论多少内存,迟早会被占光。内存泄露最终会导致内存溢出!

2> 内存溢出:内存满了,不够用

当程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个int,但给它存了long才能存下的数,那就是内存溢出。

6.[NSArray arrayWithobject:<id>] 这个方法添加对象后,需要对这个数组做释放操作吗?

不需要 这个对象被放到自动释放池中

7.Json数据的解析,和解析数据的时候有内存泄露吗?有的话 如何解

1> JSON解析的方案

l SBJson

l JSONkit

l NSJSONSerialization

2> 内存泄漏么?

8. 自动释放池底层怎么实现

自动释放池以栈的形式实现:当你创建一个新的自动释放池时,它将被添加到栈顶。当一个对象收到发送autorelease消息时,它被添加到当前线程的处于栈顶的自动释放池中,当自动释放池被回收时,它们从栈中被删除, 并且会给池子里面所有的对象都会做一次release操作.

9增加一个APP的内存占用的行为:

创建一个OC对象;

定义一个变量;

调用一个函数或方法

内存过大,系统可能会强制关闭APP。造成闪退现象,就是APP突然崩溃退出的意思,影响用户体验。

***只有OC对象才需要进行内存管理的本质原因:

OC对象存放于堆里面,非OC对象一般放在栈里面,系统会自动回收栈内存

时间: 2024-10-12 19:37:05

iOS技术面试02:内存管理的相关文章

iOS 下ARC的内存管理机制

本文来源于我个人的ARC学习笔记,旨在通过简明扼要的方式总结出iOS开发中ARC(Automatic Reference Counting,自动引用计数)内存管理技术的要点,所以不会涉及全部细节.这篇文章不是一篇标准的ARC使用教程,并假定读者已经对ARC有了一定了解和使用经验.详细的关于ARC的信息请参见苹果的官方文档与网上的其他教程:) 本文的主要内容: ARC的本质 ARC的开启与关闭 ARC的修饰符 ARC与Block ARC与Toll-Free Bridging ARC的本质 ARC是

iOS性能优化之内存管理:Analyze、Leaks、Allocations的使用和案例代码 -[转载]

最近研究代码质量检测问题,在网上找的相关资料咱是如下: 一. 一些相关概念 很多人应该比较了解这块内容了...可以权当复习复习... 1.内存空间的划分: 我们知道,一个进程占用的内存空间,包含5种不同的数据区:(1)BSS段:通常是存放未初始化的全局变量:(2)数据段:通常是存放已初始化的全局变量.(3)代码段:通常是存放程序执行代码.(4)堆:通常是用于存放进程运行中被动态分配的内存段,OC对象(所有继承自NSObject的对象)就存放在堆里.(5)栈:由编译器自动分配释放,存放函数的参数值

【IOS学习基础】内存管理

1.内存几大区域 1> 栈区:局部变量(基本数据类型.指针变量). 2> 堆区:程序运行的过程中动态分配的存储空间(创建的对象). 3> BSS段:没有初始化的全局变量和静态变量. 4> 数据区:已经初始化的全局变量和静态变量.(字符串常量) 5> 代码段:程序编译后的代码的内容. 2.引用计数器 1> 引用计数器:每个继承自NSObject的对象都有一个引用计数器,用来表示当前对象有几个拥有者. 2> 引用计数器的作用:用来判断对象是否应该回收. 3> 引

iOS中引用计数内存管理机制分析

在 iOS 中引用计数是内存的管理方式,尽管在 iOS5 版本号中.已经支持了自己主动引用计数管理模式.但理解它的执行方式有助于我们了解程序的执行原理.有助于 debug 程序. 操作系统的内存管理分成堆和栈. 在堆中分配的内存,都试用引用计数模式:在栈中则不是. NSString 定义的对象是保存在栈中,所以它没有引用计算.看一些书上说它的引用计算会是 fffffffff 最大整数.測试的结果显示它是- 1. 对该对象进行 retain 操作.不好改变它的 retainCount 值. Mut

iOS面试题之内存管理

本文围绕内存管理的几种方法展开叙述. 1.内存管理是什么? 内存管理,就是对内存资源进行优化. 2.内存管理的三种方法? Objective-C的内存管理主要有三种方式ARC(自动内存计数).MRC(手动内存计数).内存池. 3.MRC是什么?管理原则是什么?存在的问题? MRC,全称MannulReference Counting,手动内存管理 (手动引用计数),需要程序员手动的创建对象申请内存,然后再手动的释放. MRC管理内存的原则:谁创建,谁释放. 也就是说,在使用的过程中,谁retai

iOS中引用计数内存管理机制分析总结(NSString引用计数为-1的情况)

在 iOS 中引用计数是内存的管理方式,虽然在 iOS5 版本中,已经支持了自动引用计数管理模式,但理解它的运行方式有助于我们了解程序的运行原理,有助于 debug 程序.   操作系统的内存管理分成堆和栈. 在堆中分配的内存,都适用引用计数模式:在栈中则不是. NSString 定义的对象是保存在栈中,所以它没有引用计数,不是通过引用计数对内存进行管理的.之前我在一篇博客上看,说常量的引用计数会是一个很大的整数,测试的结果显示它是-1. 对该对象进行 retain 操作,不好改变它的 reta

iOS学习笔记之内存管理及@property

iOS5之后苹果公司引入了ARC机制,大大方便了ios开发者对内存的管理机制.在iphone 4出世的时候为什么ios在512M的内存中可以运行很大的游戏,保持畅快流畅的状态.得益于ios非常好的内存处理机制. 在我们现在创建项目的时候,默认会直接引入ARC机制,我们可以关闭ARC机制:在输入框中输入long点击搜索按钮,如图: 接下来即可进行老版本的内存操作了. 在老版本中,内存操作采用了引用计数(retainCount)alloc retain(+1)release(-1) 内存管理原则(配

iOS开发中的内存管理

一.为什么要进行内存管理 系统资源有限,iOS会为每个运行的程序分配30M的内存,超过20M会收到内存警告,超过30M将会终止应用程序.因此,要及时回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等,以保证应用程序能正常运行. 二.需要管理的内存 应用程序在运行过程中,会占用一定栈空间和堆空间,也就是说,应用程序运行过程中的数据,有的是放在栈中,有的是放在堆中.栈中的数据由系统维护,无需开发人员来管理,而堆中的数据需要程序员来维护. 堆空间由开发人员请求分配的,比如开发人员发

IOS基础 Day-1手动内存管理

辞职回家打算自学IOS开发,就在借个地方记录一下 Day-1      手动内存管理                   主要内容:release  retain必须配对好,不然会占用内存 慢慢积累导致错误 一旦内存占用超过40m 45m时分别发生警告,一旦超过120m 系统将kill你的app 发生闪退 主要要防止发生的问题: 1.野指针操作 2.内存泄漏 理解retain和assign的区别和 retain的原理 Main 1 // 2 // main.m 3 // 1-1内存管理 4 //