我有以下启用ARC的代码
@property (nonatomic, weak) NSArray *a;
- (void)viewDidLoad
{
[super viewDidLoad];
self.a = @[@1, @2];
NSLog(@"ab is %@", self.a); //prints details of array
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
for (id element in self.a) { //empty here
NSLog(@"blah");
}
// Dispose of any resources that can be recreated.
}
这是我使用self.a
的唯一地方。这是我编写的一个测试程序,用于调试我的一个问题。
当我模拟内存警告self.a
消失了吗?为什么呢?
答案 0 :(得分:9)
为了理解这一点,您必须了解参考计数。在Objective-C中,每个对象都有一个引用计数(即对象的强引用数)。如果没有强引用,则引用计数为0
,并且对象将被取消分配。
self.a = @[@1, @2];
创建一个自动释放的NSArray
(意味着它将在稍后阶段自动释放)并将其分配给self.a
。一旦自动释放池被耗尽,该阵列的引用计数为0
(假设没有其他强引用)并且它被解除分配。作为弱变量的self.a
自动设置为nil。
如果使用[[NSArray alloc] init]
初始化数组并将其指定给弱指针,则在赋值后将立即释放该对象。在NSLog
中,a
将为nil
。
__weak NSArray* a = [[NSArray alloc] initWithObjects:@"foo", @"bar", nil];
NSLog(@"%@", a);
在Xcode 4.6中,编译器会警告你后一种情况。
答案 1 :(得分:0)
弱引用不会延长它指向的对象的生命周期 到,并自动成为零
ARC Introduces New Lifetime Qualifiers
它不会将引用计数增加1.它不会成为该对象的所有者,而只是拥有对它的引用。如果对象的引用计数降为0,即使您可能仍然在此处指向它,它也将从内存中释放。
(nonatomic, copy, strong, weak)
因此,对于您的弱对象,它将为其分配传入值而不保留它。而且由于您无法控制对象的生命周期,因此至少有一个其他对象拥有对它的强引用,因此您引用的对象只会依赖于它。一旦不再是这种情况,对象就会被破坏,你的弱属性在使用一次后会自动设置为nil。