MST

星途 面试题库

面试题:Objective-C中ARC下对象的生命周期管理

在ARC(自动引用计数)模式下,Objective-C对象的生命周期是如何被管理的?请举例说明对象何时会被创建、保留以及释放。
30.3万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

ARC模式下Objective - C对象生命周期管理

  1. 对象创建:当使用allocnewcopymutableCopy等方法时,会创建一个新的Objective - C对象。例如:
NSString *str = [[NSString alloc] initWithFormat:@"Hello"];

此时,str指向的NSString对象被创建,引用计数为1。

  1. 对象保留
    • 局部变量:在局部作用域内,只要变量存在,对象就会被保留。例如:
- (void)testMethod {
    NSString *localStr = [[NSString alloc] initWithFormat:@"Local"];
    // localStr在这个方法作用域内被保留,对象引用计数至少为1
}
  • 属性:当一个对象被赋值给一个强引用属性时,对象会被保留。比如有一个类MyClass
@interface MyClass : NSObject
@property (nonatomic, strong) NSString *myString;
@end

@implementation MyClass
- (void)setUp {
    NSString *newStr = [[NSString alloc] initWithFormat:@"New"];
    self.myString = newStr;
    // 此时newStr指向的对象因为被赋值给强引用属性myString,引用计数加1
}
@end
  1. 对象释放
    • 超出作用域:当局部变量超出其作用域时,ARC会自动减少对象的引用计数。例如在上面testMethod方法结束时,localStr超出作用域,其指向的NSString对象引用计数减1,如果此时引用计数变为0,则对象被释放。
- (void)testMethod {
    NSString *localStr = [[NSString alloc] initWithFormat:@"Local"];
} // localStr超出作用域,对象引用计数减1,如果减为0则释放对象
  • 属性赋值新值:当一个强引用属性被赋予新值时,旧值的引用计数会减1。例如:
MyClass *obj = [[MyClass alloc] init];
NSString *str1 = [[NSString alloc] initWithFormat:@"Str1"];
obj.myString = str1;
NSString *str2 = [[NSString alloc] initWithFormat:@"Str2"];
obj.myString = str2;
// 此时str1指向的对象引用计数减1,如果减为0则释放对象,str2指向的对象引用计数加1
  • 对象被释放:当对象的引用计数降为0时,ARC会自动调用对象的dealloc方法,释放对象占用的内存。例如:
NSString *str = [[NSString alloc] initWithFormat:@"Temp"];
// 后续没有其他强引用指向str指向的对象,当str超出作用域或被赋值为nil时,对象引用计数降为0,对象被释放