查看答案
- ARC
- MRC
- AutoreleasePool
查看答案
通过alloc
new
copy
mutableCopy
retain
都会将对象引用基数+1,通过release
autorelease
会将引用基数-1.当引用计数等于0则对象释放,类方法创建的对象会自动autorelease
,autorelease
会将对象放在runloop
释放池中,每次事件循环都会将释放池对象的引用计数-1.在ARC
中系统帮你添加retain
release
autorelease
。
查看答案
- 谁创建谁管理
- 谁持有谁释放
查看答案
自动释放池是通过栈实现的,现今后出。当事件开始会创建一个自动释放池到栈中,当对象发送autorelease
消息会把当前对象放在自动释放池中。对自动释放池满会自动创建新的自动释放池,当事件循环之后,将栈最上面的自动释放池的对象进行释放。
查看答案
自动释放池是管理自动释放的对象,会把发送autorelease
消息的对象添加到自动释放池。当事件结束,会将自动释放池释放,全部的对象进行release操作。
查看答案
对象调用一次autorelease
就会将对象添加到自动释放池依次,多次调用就多次添加。到自动释放池释放,会将对象多次release,从而造成野指针异常。
查看答案
- 程序启动时候创建
- 事件开始时候创建
- 自动释放池满自动创建
查看答案
- 程序结束销毁
- 事件结束销毁
- 释放池满销毁
查看答案
- 不要在自动释放池大量的创建对象,会导致延迟释放,内存暴涨
- 不要对占用内存大的对象使用
autorelease
查看答案
readonly&readwrite
控制生成
Get
和Set
的方法,readonly
只生成Get
方法,readwrite
会同时生成Get
和Set
方法。
atomic&nonatomic
atomic
会自动在Set
和Get
方法进行加锁操作
retain©&assgin
retain
会在Set
方法对于旧值release
,对新值retain
copy
会在Set
方法对于旧值release
,对新值copy
assgin
会直接的进行赋值操作
strong&weak
strong会将对象引用计数+1,weak不会对对象进行引用操作。
查看答案
代码区
存放二进制代码
数据区
存放常量和静态变量
堆区
程序员自己申请管理,存放对象和进行
copy
操作的block
栈区
程序自己操作 存放没有经过
Copy
的block和局部变量和基本变量
查看答案
队列是先进先出,栈是先进后出。
查看答案
- Memory Leaks
- Alloctions
- 静态分析
- Debug Memory Graph
- MLLeadkFinder
查看答案
悬垂指针
只指向的内存已经释放,但是指针还没有释放。野指针
是还没有进行初始化的指针。
查看答案
因为指针指向的内存已经释放,但是指针没有释放,也就是悬垂指针
引起的。
查看答案
因为NSMutableArray
是NSArray
的子类,NSMutableString
是NSString
子类,NSMutableDictionary
是NSDictionary
子类。如果用strong
关键词就会在指向子类时候,因为是可变的会被修改数据,copy
是浅拷贝是赋值一份不可变的内存,这样就算子类修改也不影响当前数据。
查看答案
因为copy
是浅拷贝,通过copy
修饰的可变对象在编译时期是可变,在运行时时不可变的,容易开发中调用可变对象的方法造成找不到方法崩溃。