#####面试:说一说对内存管理的理解?(原理)
- 手动内存管理(MRC):1.在创建一个对象的时候系统会自动创建这个对象的引用计数并赋值为1;2.当引用计数为0的时候,对象会去调用dealloc方法来销毁对象;3.对象调用release方法会让引用计数减1,retain方法会让引用计数加1;
- 自动内存管理(ARC):1.在ARC管理内存的实质还是通过引用计数去管理的,但是程序员不再关心引用计数器的值,因为在ARC环境下,系统会在程序编译的时候会自动在合适的地方添加retain和release或者autorelease方法;在ARC中,当有强指针指向对象的时候对象不销毁,弱指针不影响对象的销毁,指针默认都是强指针,_weak:使用这个关键字修饰的指针都是弱指针;默认是_strong.
#####面试题:内存管理的原则?
- 手动内存管理的原则:程序中如果出现alloc,retain,new必须配对出现release或者autorelease:谁创建谁释放,在哪儿创建在哪儿释放;谁加1谁减1;
#####为什么需要内存管理?
- 内存管理的两大问题:内存泄露(没有释放)和野指针(没有使用或者置空)
#####说说autoreleasePool和autorelease的作用:
- autoreleasepool的原理:当autoreleasePool销毁的时候会自动将自动释放池中所有的对象调用一次release方法;
- autorelease的作用:将对象添加到自动释放池中(并不是写在自动释放池的大括号中得对象就是自动释放池的对象);
#####MRC中符合内存管理的set方法的书写:
- 旧值release,新值retain,然后赋值
#####属性修饰符
- strong:控制@property实现符合内存管理的set方法,引用计数加1应用于修饰一般的对象;
- weak:控制@property实现一般的set方法(直接赋值),修饰对象用来避免循环引用;
- copy:控制@property实现的set方法,会先创建一个新的对象,将参数的值传给新的对象,最后将新的对象赋给成员变量(常用来修饰字符串,数组,字典和block);
- assign:控制@property实现一般的set方法(直接赋值),常用来修饰基本数据类型
- retain:相当于MRC的strong(实现的set方法就是旧值release,新值retain);
```Object-c
1.内存管理的作用:解决内存泄露和野指针的问题
2.为什么要内存管理,需要注意的问题是什么?
3.内存管理的原理:MRC(引用计数管理内存)和ARC(强指针和弱指针)。
4.什么是内存管理原则:谁创建谁释放,谁+1谁-1
5.在内存管理中setter函数的写法(旧值release,新值retain,赋值)
6.@property参数retain避免循环引用(相当于strong)
7.什么时候使用autorelease?与release的区别:autorelease将对象添加到自动释放池中,
release就是即时将对象的引用计数器减1,对象需要延时销毁的时候使用autorelease方法;
8.什么是自动释放池?注意:autoreleasePool和autorelease是成对出现的!!
9.阐述内存管理:
10.一个工程中可以使用NSAutoreleasePool或者@autoreleasepool创建多个自动释放池;
11.手动内存管理必须即时销毁对象,而autorelease会延迟对象的销毁,如果所有对象都延迟 时销毁的话相当于没有做内存管理;
12.在ARC中可以重写dealloc方法但是绝对不可以调用父类的dealloc方法,在对象将要被销毁的时候会自动调用dealloc.
```
```Object-c
#import <Foundation/Foundation.h>
#import "FJStudent.h"//避免重复引用
int main(int argc, const char * argv[]) {
@autoreleasepool {
//1.创建一个学生对象(对象在堆上)
//2.创建一个学生指针(指针在栈上)
//3.指针指向了学生对象(指针中存储了学生对象的地址)
FJStudent *student = [[FJStudent alloc]init];
//如果这里加上student = nil那么在这里就被销毁,因为指针已经置空
//如果:_weak FJStudent *student = [[FJStudent alloc]init];
//弱指针创建就被销毁!
student.name = @"luhan ";
}//在这里被释放,跟autoreleasepool无关,因为在堆上创建一个学生对象
//在栈上创建一个强指针,遇到花括号后,指针被销毁,没有强指针指向对象,所以被销毁;
return 0;
}
```