面试题答案
一键面试ARC模式下Objective - C对象生命周期管理
- 对象创建:当使用
alloc
、new
、copy
、mutableCopy
等方法时,会创建一个新的Objective - C对象。例如:
NSString *str = [[NSString alloc] initWithFormat:@"Hello"];
此时,str
指向的NSString
对象被创建,引用计数为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
- 对象释放:
- 超出作用域:当局部变量超出其作用域时,ARC会自动减少对象的引用计数。例如在上面
testMethod
方法结束时,localStr
超出作用域,其指向的NSString
对象引用计数减1,如果此时引用计数变为0,则对象被释放。
- 超出作用域:当局部变量超出其作用域时,ARC会自动减少对象的引用计数。例如在上面
- (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,对象被释放