面试题答案
一键面试对象被系统释放的情况
在Objective - C的ARC环境下,当一个对象的引用计数降为0时,系统会自动释放该对象。以下几种常见情况会导致对象引用计数变化从而可能被释放:
- 超出作用域:当对象的指针在其定义的作用域结束时,如果没有其他强引用指向该对象,其引用计数会降为0。例如在一个函数内部定义的局部对象,函数执行结束时,该对象超出作用域。
- 强引用关系解除:如果一个对象的所有强引用被移除,其引用计数会降为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而被释放。