MST

星途 面试题库

面试题:Objective-C中ARC下对象何时会被释放

在Objective-C的自动引用计数(ARC)环境下,简述一个对象在什么情况下会被系统释放,并举一个简单示例说明。
45.5万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

对象被系统释放的情况

在Objective - C的ARC环境下,当一个对象的引用计数降为0时,系统会自动释放该对象。以下几种常见情况会导致对象引用计数变化从而可能被释放:

  1. 超出作用域:当对象的指针在其定义的作用域结束时,如果没有其他强引用指向该对象,其引用计数会降为0。例如在一个函数内部定义的局部对象,函数执行结束时,该对象超出作用域。
  2. 强引用关系解除:如果一个对象的所有强引用被移除,其引用计数会降为0。比如将持有对象的强引用属性设为nil

示例

#import <Foundation/Foundation.h>

@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
@end

@implementation Person
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // 创建一个Person对象,此时对象引用计数为1
        Person *person = [[Person alloc] init];
        person.name = @"John";
        // person对象在这个代码块结束时超出作用域,
        // 由于没有其他强引用指向它,其引用计数降为0,被系统释放
    }
    return 0;
}

在上述代码中,person对象在@autoreleasepool块结束时超出作用域,由于没有其他地方持有对person的强引用,所以该Person对象的引用计数降为0,被系统自动释放。同时,person对象所持有name属性指向的NSString对象,由于person对象被释放,name属性的强引用关系解除,若没有其他强引用指向该NSString对象,它也会因引用计数降为0而被释放。