了解自动引用计数

时间:2012-08-17 23:40:19

标签: objective-c automatic-ref-counting

我理解自动引用计数的方式是:

如果一个对象将被各种类消费,那么它应该是“强”类型,以便它保持在周围而其他人可能正在使用它。

如果一个对象只是一个类的内部结构,它可以是“弱”类型,因为一旦处理完当前的类实现它就会消失。

还有更多吗?

这是我想象的一个例子:

#import "World.h"
@interface Foo : NSObject
@property (nonatomic, strong) NSArray *barArray;
@property (nonatomic, weak) NSString *bazString;
@end

@implementation Foo
-(void)sendTheArrayIntoTheWorld {
    self.barArray = [NSArray arrayWithObject:@"lonely item"];
    [World takeTheArray:self.barArray]; // array is strong so it can exist indefinitely
}

-(void)useThatString {
    self.bazString = "weak old string"; // string is weak because it should be discarded when it's no longer needed here...
}
@end

1 个答案:

答案 0 :(得分:0)

这不是ARC的工作方式。归结为:

  • 强引用是唯一能够保持对象存活的内容
  • 对象至少需要一个strong引用才能保持活动
  • 弱引用不会使对象保持活动状态 - 如果对象有100个弱引用但没有强引用,则对象将被释放
  • 将值分配给weak属性而不在其他位置引用它将导致其立即释放,与bazString一样。如果你在为它分配一个值后尝试访问该字符串(除非它被另一个对象拥有,就像数组一样,它不是你的情况),你会发现它是nil

这意味着弱引用应该用于您不一定“控制”的对象,如委托。如果您对委托使用强引用,并且委托对您有强烈的引用,那么这两个对象都不会被释放。这称为保留周期。

如果您需要一个对象保持活着,直到完成它,请使用strong。否则,请使用weak

您可以阅读有关ARC here的复杂性和功能的更多信息。