ImageVerifierCode 换一换
格式:DOCX , 页数:8 ,大小:19.69KB ,
资源ID:27073896      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/27073896.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(5IOS面试题内存管理.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

5IOS面试题内存管理.docx

1、5IOS面试题内存管理1. 属性readwrite,readonly,assign,retain,copy,nonatomic,atomic各是什么作用,在那种情况下用?readwrite 是可读可写特性;需要生成getter方法和setter方法时使用readonly 是只读特性 只会生成getter方法 不会生成setter方法;不希望属性在类外改变assign 是赋值特性,不涉及引用计数,弱引用,setter方法将传入参数赋值给实例变量;仅设置变量时;retain 表示持有特性,setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1;copy 表示拷贝特性,se

2、tter方法将传入对象复制一份;需要完全一份新的变量时。nonatomic 非原子操作,不加同步,多线程访问可提高性能,但是线程不安全的。决定编译器生成的setter getter是否是原子操作。atomic 原子操作,同步的,表示多线程安全,与nonatomic相反2. Difference between shallow copy and deep copy?浅复制和深复制的区别?浅层复制:只复制指向对象的指针,而不复制引用对象本身。深层复制:复制引用对象本身。意思就是说我有个A对象,复制一份后得到A_copy对象后,对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的只不过是一

3、个指针,对象本身资源。对于深复制来说,A和A_copy指向的是两个不同的内存资源,他们是两份独立对象本身。用网上一哥们通俗的话将就是:浅复制好比你和你的影子,你完蛋,你的影子也完蛋深复制好比你和你的克隆人,你完蛋,你的克隆人还活着。3. 什么是栈内存(stack)?什么是堆内存(heap)?栈内存:由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈(先进后出)。在内存中占连续的空间,紧密依次排列,效率很高,要优于堆内存,但是分配容量有限。在IOS开发中,栈内存里主要存放的是任何C类型,如int 、 short、char、long、struct、enum等基

4、本数据类型或者结构体。堆内存:也叫散列堆,在运行的过程中动态内存分配。需要在创建对象的时候通过alloc开辟空间,不用的时候需要release释放,因为开辟的空间的时候不不是完全连续的,所以会出现内存碎片,需要我们管理。此外,如果我们动态的申请了内存,使用结束后没有释放,就会发生内存泄露。堆内存主要存储继承自NSObject类的所有OC对象。4. IOS开发内存管理的对象有哪些?不管理的有哪些?内存管理的对象为继承自NSObject类的所有OC对象,也就是存在堆内存中的数据,也叫引用类型。不需要管理的对象为任何C类型,如int 、 short、char、long、struct、enum等基本数

5、据类型或者结构体,它们存放在栈内存中,也叫值类型。OC主要管理的是堆内存,栈内存自动管理。5. 什么是引用类型?什么是值类型?它们之间可以相互转化么?引用类型就是继承NSObject类的类型。值类型就是C中基本数据类型。引用类型和值类型之间可以进行相互的转化,比如NSNumber与int,两者就可以转化:NSNumber *number = NSNumber numberWithInt:1; int num = number intValue;6.什么是装箱(boxing)?什么是拆箱(unboxing)?把值类型转为引用类型,叫装箱,也叫向上转型。把引用类型转为值类型,叫拆箱,也叫向下转型。

6、7.装箱和拆箱会造成什么问题?装箱,向上转型,会造成性能损失。拆箱,向下转型,会造成安全性问题。8. Objective-C如何对内存管理的,说说你的看法和解决方法?内存管理,就是对内存资源进行优化。Objective-C的内存管理主要有三种方式ARC(自动内存计数)、MRC(手动内存计数)、内存池。ARC现在用的比较广泛,它可以简化我们的代码,不用担心内存泄露。(补充解释三种方式,参见后面题目)9. MRC是什么? 它的管理原则是什么?管理不好会出现什么问题?MRC,全称Mannul Reference Counting,手动内存管理 (手动引用计数),需要程序员手动的创建对象申请内存,然后

7、再手动的释放。MRC管理内存的原则:谁创建,谁释放。也就是说,在使用的过程中,谁retain,谁release;或者谁alloc,谁release。在使用MRC时,当引用计数为0时,必须回收,引用计数不为0,则不回收;如果内存计数为0了,没回收,会造成内存泄露。如果想使用已经创建好的某个对象(别人创建的),不能直接拿过去用,需要先retain(让计数+1),用完之后应该release(计数-1),否则会造成野指针。10. 什么是野指针?如何避免野指针?野指针(不知道指向哪里的指针),它指向了一块不属于它的内存,可能是别人的内存,也可能之前是自己的,但是被别人释放了。避免野指针的方式就是释放之后

8、,让指针等于nil,这个时候在重复释放,则不会提示错误。nil:又名空,是操作系统持有的内存,任何人都夺不去的内存。11. 如何解决A reatain B, B reatain A,相互持有的问题?一方用retain,一方用weak。12. ARC是什么?ARC是iOS 5推出的新功能,全称叫Automatic Reference Counting,自动引用计数。简单地说,就是代码中自动加入了retain/release,原先需要手动添加的用来处理内存管理的引用计数的代码可以自动地由编译器完成了。使用ARC,只要某个对象被任一strong指针指向,那么它将不会被销毁。如果对象没有被任何stro

9、ng指针指向,那么就将被销毁。使用ARC后,不允许调用release,retain、retainCount等方法。允许重写dealloc,但是不允许调用super dealloc,系统会默认调用super dealloc。13. 谈谈ARC与MRC各自优缺点?ARC优点是使用起来比较简单,不用自己考虑内存问题等,在MRC时代你需要自己retain一个想要保持的对象,而现在不需要了。现在唯一要做的是用一个指针指向这个对象,只要指针没有被置空,对象就会一直保持在堆上。当将指针指向新值时,原来的对象会被release一次。ARC缺点是如果出现循环引用的时候,容易出现内存泄露。此外,许多第三方的库是用

10、MRC写的,如果使用,需要做一定处理。MRC优点是程序员对于内存的控制比较强,可以很好的解决内存问题。MRC 缺点是需要手动的写大量代码管理内存,保证谁创建谁释放,避免空指针,要很仔细才可以。14. ARC与MRC两者可以混着一起用么?可以。ARC中使用MRC: 在targets的build phases选项下Compile Sources下选择要不使用arc编译的文件,双击它,输入 -fno-objc-arc 即可.MRC中使用ARC: 在targets的build phases选项下Compile Sources下选择要使用arc编译的文件,双击它,输入 -fobjc-arc 即可。15

11、.Is there any garbage collection mechanism in Objective C.?OC的垃圾回收机制?OC2.0有Garbage collection,但是iOS平台不提供,只针对mac应用程序开发。注意要与MRC、ARC区分开。16. 什么是引用计数 (Retain Count)?判断对象是否被回收的标志,如果为0回收,不为0不回收。每个OC对象都有自己的引用计数器,它是一个整数,表示对象被引用的数量。每个OC对象内部专门有4个字节的存储空间来存储引用计数器。17. 内存管理的几个关键字分别是什么?引用计数在什么时候+1减-1?关键字有:alloc 分配内

12、存、release 释放、retain 对象new或者alloc(分配内存)时+1;对象发送retain时+1;对象release(释放)时-1.ARC模式下不需要自己管理引用计数。MRC模式下需要自己管理引用计数:当引用计数为0,对象被销毁;销毁时调用dealloc方法。如果要重写dealloc,必须调用super dealloc,并且必须写到最后一句。如果调用了dealloc,对象将被回收,内存不可以使用,再次使用会crash(闪退)。18. autorelease是什么意思?优势?缺点?autorelease类似于release,但是不等同于它,release调用后引用计数马上-1。au

13、torelease是在创建对象的时候写的,表示加入自动释放池,当释放池销毁时,才调用引用计数-1。优点:可以简化操作,由自动释放池管理。只有在自动释放池销毁时才对里面的对象进行销毁,程序员不用关心对象的销毁时间,也不用再去调用release。缺点:因为是延迟释放,可以延长对象的生命周期。所以不要随意使用,因为对象生命周期延长,会一直持有内存,会减慢速度。适合占内存小的对象使用。19. autoreleasepool是什么? 自动释放池,需要手动创建。当调用pool drain方法时,会调用池中得全部对象,release掉他们。20. ARC中两种引用方式? strong :强引用(指向它自己,

14、不管别人)与retain类似,使用之后,计数器+1。weak : 弱引用(依附于别人,别人在,它在,别人不在,他也不在,计数永远为1)如果指向的对象被释放了,其指向nil,可以有效的避免野指针。21.内存管理的几条原则是什么?按照默认法则.那些关键字生成的对象需要手动释放?在和property结合的时候怎样有效的避免内存泄露?谁申请,谁释放遵循Cocoa Touch的使用原则;内存管理主要要避免“过早释放”和“内存泄漏”。对于“过早释放”需要注意property设置特性时,一定要用对特性关键字;对于“内存泄漏”,一定要申请了要负责释放,要细心。如果使用MRC,关键字alloc 或new 生成的

15、对象需要手动释放;设置正确的property属性,对于retain需要在合适的地方释放.ARC是不需要手动释放的。22. 看下面的程序,第一个NSLog会输出什么?这时str的retainCount是多少?第二个和第三个呢? 为什么? NSMutableArray* ary = NSMutableArray array retain;NSString *str = NSString stringWithFormat:test;str retain;ary addObject:str;NSLog(First: % %i,str,str retainCount); str retain;str r

16、elease;str release;NSLog(% %i,str,str retainCount);ary removeAllObjects;NSLog(% %i,str,str retainCount);答案:First: test 3str的retainCount创建+1,retain+1,加入数组自动+1Secound: test 2retain+1,release-1,release-1Third: test 1数组删除所有对象,所有数组内的对象自动-123. 如何对iOS设备进行性能测试?Profile- Instruments -Time Profiler24.写一个setter方法用于完成property (nonatomic,retain)NSString *name;- (void) setName:(NSString*) str str retain; name release; name = str;写一个setter方法用于完成property(nonatomic,copy)NSString *name;- (void)setName:(NSString *)str id t = str copy; name release;name = t;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1