0

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

如果一个对象要被各种类使用,它应该是“strong”类型,这样它就可以保留,而其他人可能正在使用它。

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

还有比这更多的吗?

这是我想象的一个例子:

#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
4

1 回答 1

0

这并不是 ARC 的工作原理。归结为:

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

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

如果您需要一个对象在完成之前一直保持活力,请使用strong. 否则,使用weak.

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

于 2012-08-17T23:44:59.710 回答