OC内存管理常见的面试题

#####面试:说一说对内存管理的理解?(原理)程序员

 - 手动内存管理(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方法;it

 - 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;

}

```

相关文章
相关标签/搜索