面试题-内存管理(MRC)

来源:互联网 发布:linux怎么复制文件命令 编辑:程序博客网 时间:2024/05/22 14:00

1.什么是自动应用计数

  • 自动引用计数(ARC,Automatic Reference Counting)是指内存管理中对引用采取自动计数的计数。
  • 在Objective-C中采用ARC机制,让编译器来进行内存管理。

2.采用ARC的好处

  • 在代码中无需手动键入retain或者release代码,减少了开发程序的工作量。
  • 降低程序崩溃、内存泄漏的风险。
  • 编译器完全清除目标对象,并能立刻释放不再被使用的对象。
  • 应用程序具有可预测性,流畅运行,速度大幅提升。

3.使用ARC的前提

  • 使用Xcode4.2或以上版本。
  • 使用LLVM编译器3.0或以上版本。
  • 编译器选项中设置ARC为有效。

4.内存管理的思考方式

  • 自己生成的对象,自己所持有。

        使用以下名称开头的方法意味着自己生成的对象只有自己持有:    alloc    new    copy    mutableCopy 
    // 自己生成并持有对象id obj = [[NSObject alloc] init];// 自己持有对象
  • 非自己生成的对象,自己也能持有。

        用alloc/new/copy/mutableCopy以外的方法取得的对象,因为非自己生成并持有,所以自己不是该对象的持有者。使用retain方法可以持有对象。
    // 取得非自己生成并持有的对象id obj = [NSMutableArray array];// 取得的对象存在,但自己不持有对象[obj retain];// 自己持有对象
        通过retain方法,非自己生成的对象跟用alloc/new/copy/mutableCopy方法生成并持有的对象一样,成为自己所持有的。
  • 不再需要自己持有的对象时释放。

        自己持有的对象,一旦不需要,持有者有义务释放该对象。释放采用release方法。
    // 自己生成并持有对象id obj = [NSObject alloc] init];// 自己持有对象[obj release];// 释放对象。指向对象的指针仍然保存在变量obj中,但对象一经释放绝对不可访问。
  • 非自己持有的对象无法释放。

        对于用alloc/new/copy/mutableCoy方法生成并持有的对象,或是用retain方法持有的对象,由于持有者是自己,所以在不需要改对象时需要将其释放。而由此以外所得到的对象绝对不能释放。如果在应用程序中释放了非自己所持有的对象就会造成崩溃。例如自己生成并持有对象后,在释放完不再需要对象之后再次释放。或者在取得的对象存在,但自己不持有对象时释放。

5. copy与mutableCopy的区别

  • copy方法遵守NSCopying方法约定,由各类实现的copyWithZone:方法生成并持有对象的副本。
  • mutableCopy方法遵守NSMutableCopying协议,由各类实现的mutableCoyWithZone:方法生成并持有对象的副本。
  • copy方法生成不可变更的对象,而mutableCopy方法生成可变更的对象。
  • 用这些方法生成的对象,虽然是对象的副本,但同alloc、new方法一样,自己生成并持有对象。

6. 操作和方法的对应关系

对象操作 Objective-C方法 生成并持有对象 alloc/new/copy/mutableCopy等方法 持有对象 retain方法 释放对象 release方法 废弃对象 dealloc方法

7. autorelease

  • autorelease是自动释放,类似于C语言中的自动变量(局部变量)的特性。
  • 当对象实例超出其作用域时,对象实例的release实例方法被调用。
  • 同C语言的自动变量不同的是,编程人员可以设定变量的作用域。
  • 具体使用:

    Created with Raphaël 2.1.0生成并持有NSAutoreleasePool对象调用已分配对象的autorelease实例方法废弃NSAutoreleasePool对象NSAutoreleasePool中的对象自动调用release方法
    NSAutoreleasePool *pool = [NSAutoreleasePool alloc] init];id obj = [[NSObject alloc] init];[obj autotelease];[pool drain]; //等同于[obj release]

8. autorelease NSAutoreleasePool对象会如何?

    发生异常。    通常在使用Objective-C,也就是Foundation框架时,无论调用哪一个对象的autorelease实例方法,实现上调用的事NSObject类的autorelease实例方法。但是对于NSAutoreleasePool类,autorelease实例方法已被该类重载,因此运行时会出错。
0 0
原创粉丝点击