Skip to content

Latest commit

 

History

History
153 lines (113 loc) · 4.72 KB

内存管理面试题.md

File metadata and controls

153 lines (113 loc) · 4.72 KB

OC的内存管理主要有三种方式

查看答案
  • ARC
  • MRC
  • AutoreleasePool

OC中内存管理的基本思想

查看答案

通过alloc new copy mutableCopy retain都会将对象引用基数+1,通过release autorelease会将引用基数-1.当引用计数等于0则对象释放,类方法创建的对象会自动autoreleaseautorelease会将对象放在runloop释放池中,每次事件循环都会将释放池对象的引用计数-1.在ARC中系统帮你添加retain release autorelease

苹果官方基础内存管理规则:

查看答案
  • 谁创建谁管理
  • 谁持有谁释放

自动释放池底层怎么实现

查看答案

自动释放池是通过栈实现的,现今后出。当事件开始会创建一个自动释放池到栈中,当对象发送autorelease消息会把当前对象放在自动释放池中。对自动释放池满会自动创建新的自动释放池,当事件循环之后,将栈最上面的自动释放池的对象进行释放。

什么是自动释放池?

查看答案

自动释放池是管理自动释放的对象,会把发送autorelease消息的对象添加到自动释放池。当事件结束,会将自动释放池释放,全部的对象进行release操作。

多次调用对象的autorelease方法会导致什么问题?

查看答案

对象调用一次autorelease就会将对象添加到自动释放池依次,多次调用就多次添加。到自动释放池释放,会将对象多次release,从而造成野指针异常。

自动释放池,什么时候创建?

查看答案
  • 程序启动时候创建
  • 事件开始时候创建
  • 自动释放池满自动创建

什么时候销毁的?

查看答案
  • 程序结束销毁
  • 事件结束销毁
  • 释放池满销毁

自动释放池使用注意

查看答案
  • 不要在自动释放池大量的创建对象,会导致延迟释放,内存暴涨
  • 不要对占用内存大的对象使用autorelease

@property内存管理策略的选择

查看答案

readonly&readwrite

控制生成GetSet的方法,readonly只生成Get方法,readwrite会同时生成GetSet方法。

atomic&nonatomic

atomic会自动在SetGet方法进行加锁操作

retain&copy&assgin

retain会在Set方法对于旧值release,对新值retain copy会在Set方法对于旧值release,对新值copy assgin会直接的进行赋值操作

strong&weak

strong会将对象引用计数+1,weak不会对对象进行引用操作。

简述内存分区情况

查看答案

代码区

存放二进制代码

数据区

存放常量和静态变量

堆区

程序员自己申请管理,存放对象和进行copy操作的block

栈区

程序自己操作 存放没有经过Copy的block和局部变量和基本变量

队列和栈有什么区别

查看答案

队列是先进先出,栈是先进后出。

在 Obj-C 中,如何检测内存泄漏?你知道哪些方式?

查看答案
  • Memory Leaks
  • Alloctions
  • 静态分析
  • Debug Memory Graph
  • MLLeadkFinder

说一下什么是 悬垂指针?什么是 野指针?

查看答案

悬垂指针只指向的内存已经释放,但是指针还没有释放。野指针是还没有进行初始化的指针。

BAD_ACCESS 在什么情况下出现?

查看答案

因为指针指向的内存已经释放,但是指针没有释放,也就是悬垂指针引起的。

NSArray NSString NSDictionary为什么要用copy修饰

查看答案

因为NSMutableArrayNSArray的子类,NSMutableStringNSString子类,NSMutableDictionaryNSDictionary子类。如果用strong关键词就会在指向子类时候,因为是可变的会被修改数据,copy是浅拷贝是赋值一份不可变的内存,这样就算子类修改也不影响当前数据。

NSMutableArray NSMutableString NSMutableDictionary为什么用strong不用copy

查看答案

因为copy是浅拷贝,通过copy修饰的可变对象在编译时期是可变,在运行时时不可变的,容易开发中调用可变对象的方法造成找不到方法崩溃。