Objective c 理解自动参考计数

Objective c 理解自动参考计数,objective-c,automatic-ref-counting,Objective C,Automatic Ref Counting,我对自动引用计数的理解如下: 如果一个对象将被不同的类使用,那么它应该是“strong”类型,这样它就可以在其他类使用它时保持不变 如果一个对象只是一个类的内部结构,那么它可以是“弱”类型,因为一旦当前的类实现处理完它,它就会消失 还有比这更重要的吗 下面是我想象的一个例子: #import "World.h" @interface Foo : NSObject @property (nonatomic, strong) NSArray *barArray; @property (nonatom

我对自动引用计数的理解如下:

如果一个对象将被不同的类使用,那么它应该是“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

这并不是ARC的工作原理。归结起来就是:

  • 强引用是唯一使对象保持活动状态的引用
  • 对象至少需要一个
    strong
    引用才能保持活动状态
  • 弱引用不会使对象保持活动状态-如果有100个对对象的弱引用,但没有强引用,则该对象将被释放
  • 将值分配给
    属性而不在其他地方引用它将导致其立即解除分配,就像您的
    字符串
    一样。如果您在为该字符串赋值后尝试访问该字符串(除非该字符串属于另一个对象,如数组,但在您的情况下不属于该对象),您会发现它是
    nil
这意味着弱引用应该用于不必“控制”的对象,如委托。如果您对委托使用强引用,并且该委托对您具有强引用,则两个对象都不会被解除分配。这称为保留循环

如果您需要一个对象在处理完之前保持活动状态,请使用
strong
。否则,请使用


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

当您执行“@property(readonly)”时,这根本不会改变引用计数,对吗?对。您会注意到,
readonly
同样可以用于对象和原语-它对属性的保留计数没有影响,只影响它是否可以被另一个对象更改。另外--这样合适吗。。。因为游戏类将实例化一艘宇宙飞船,假设飞船的行为基于它所处的级别——它将把级别传递给所创建的宇宙飞船。。。所以在这种情况下,宇宙飞船类应该对关卡对象有一个弱引用,因为游戏类已经抓住了它。。。这是正确的思考方式吗?当苹果说“10.6/iOS4不支持弱引用”时,这是什么意思?如何支持ARC而不是弱引用?当在这些平台上用弱引用声明属性时会发生什么情况?是的,该层次结构将起作用。“不支持弱引用…”意味着如果您正在为这些平台制作应用程序,您必须使用
safe\u unretained
而不是
Weak
。它本质上是相同的,只是当对象的保留计数为0时,它不会将其置零。这是一个重要的区别。还有其他一些小差异,你可以在我在回答中发布的链接中看到。