1 / 13
文档名称:

【5】IOS面试题--内存管理.doc

格式:doc   大小:76KB   页数:13页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

【5】IOS面试题--内存管理.doc

上传人:ttteee8 2020/6/19 文件大小:76 KB

下载得到文件列表

【5】IOS面试题--内存管理.doc

文档介绍

文档介绍:,readonly,assign,retain,copy,nonatomic,atomic各是什么作用,在那种情况下用?readwrite是可读可写特性;需要生成getter方法和setter方法时使用readonly是只读特性只会生成getter方法不会生成setter方法;不希望属性在类外改变assign是赋值特性,不涉及引用计数,弱引用,setter方法将传入参数赋值给实例变量;仅设置变量时;retain表示持有特性,setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1;copy表示拷贝特性,setter方法将传入对象复制一份;需要完全一份新的变量时。nonatomic非原子操作,不加同步,多线程访问可提高性能,但是线程不安全的。决定编译器生成的settergetter是否是原子操作。atomic原子操作,同步的,表示多线程安全,与nonatomic相反Differencebetweenshallowcopyanddeepcopy?浅复制和深复制的区别?浅层复制:只复制指向对象的指针,而不复制引用对象本身。深层复制:复制引用对象本身。意思就是说我有个A对象,复制一份后得到A_copy对象后,对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的只不过是一个指针,对象本身资源。对于深复制来说,A和A_copy指向的是两个不同的内存资源,他们是两份独立对象本身。用网上一哥们通俗的话将就是:浅复制好比你和你的影子,你完蛋,你的影子也完蛋深复制好比你和你的克隆人,你完蛋,你的克隆人还活着。什么是栈内存(stack)?什么是堆内存(heap)?栈内存:由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈(先进后出)。在内存中占连续的空间,紧密依次排列,效率很高,要优于堆内存,但是分配容量有限。在IOS开发中,栈内存里主要存放的是任何C类型,如int、short>char、long、structenum等基本数据类型或者结构体。堆内存:也叫散列堆,在运行的过程中动态内存分配。需要在创建对象的时候通过alloc开辟空间,不用的时候需要release释放,因为开辟的空间的时候不不是完全连续的,所以会出现内存碎片,需要我们管理。此外,如果我们动态的申请了内存,使用结束后没有释放,就会发生内存泄露。堆内存主要存储继承自NSObject类的所有0C对象。IOS开发内存管理的对象有哪些?不管理的有哪些?内存管理的对象为继承自NSObject类的所有0C对象,也就是存在堆内存中的数据,也叫引用类型。不需要管理的对象为任何C类型,如int>short、char、long、struct、enum等基本数据类型或者结构体,它们存放在栈内存中,也叫值类型。0C主要管理的是堆内存,栈内存自动管理。什么是引用类型?什么是值类型?它们之间可以相互转化么?引用类型就是继承NSObject类的类型。值类型就是C中基本数据类型。引用类型和值类型之间可以进行相互的转化,比如NSNumber与int,两者就可以转化:NSNumber*number=[NSNumbernumberWithlnt:1];intnum=[numberintValue];什么是装箱(boxing)?什么是拆箱(unboxing)?把值类型转为引用类型,叫装箱,也叫向上转型。把引用类型转为值类型,叫拆箱,也叫向下转型。?装箱,向上转型,会造成性能损失。拆箱,向下转型,-C如何对内存管理的,说说你的看法和解决方法?内存管理,就是对内存资源进行优化。Objective-C的内存管理主要有三种方式ARC(自动内存计数)、MRC(手动内存计数)、内存池。ARC现在用的比较广泛,它可以简化我们的代码,不用担心内存泄露。(补充解释三种方式,参见后面题目)MRC是什么?它的管理原则是什么?管理不好会出现什么问题?MRC,全称MannulReferenceCounting,手动内存管理(手动引用计数),需要程序员手动的创建对象申请内存,然后再手动的释放。MRC管理内存的原则:谁创建,谁释放。也就是说,在使用的过程中,itretain,itrelease;或者谁alloc,谁releaseo在使用MRC时,当引用计数为0时,必须回收,引用计数不为0,则不回收;如果内存计数为。了,没回收,会造成内存泄露。如果想使用已经创建好的某个对象(别人创建的),不能直接拿过去用,需要先retain(让计数+1),用完之后应该release(计数-1),否则会造成野指针。什么是野指针?如何避免野指针?野指针(不知道指向哪里的指针),它指向了一块不属于它的内存,可能是别人的