【问题标题】:In Objective C, When is weak object released under ARC?在Objective C中,ARC下的弱对象何时释放?
【发布时间】:2015-07-24 06:04:09
【问题描述】:

由于引用计数变为0会导致对象被释放。 我很好奇一个弱对象什么时候释放,因为计数总是0,当我声明一个弱对象时,我需要担心它会中途释放吗?

例如

NSObject ClassA

@property (weak) NSString stringA;


- init() {
    ...
    stringA = @"this is a weak string";
    ...
}

- doSomething() {
    // When I call this function later, 
    // is there any chance at this point stringA has been released?
    NSLog(stringA);
}

【问题讨论】:

  • 大概其他的东西仍然有很强的参考价值,不是吗?
  • 比如我有一个班级,有一个成员:@property (weak) NSObject object;什么时候发布?
  • 你是如何分配的?物体从哪里来?如果在任何地方都没有强烈的引用,我会担心......
  • 字符串是一个不好的例子。他们是“特别的”。但是是的,如果您以一种方法分配给您的弱属性,并且没有其他人对它有另一个引用,那么它可以在doSomething 之前发布。这就是弱引用的意义所在,不是吗?

标签: objective-c automatic-ref-counting weak-references


【解决方案1】:

只有通过IBOutletdelegate/datasource 连接的弱属性才能声明(引用另一个UIViewController)。

如果你做了一个弱属性,它会在实例化后立即释放。但是,通过IBOutlet 连接的weak 属性不会释放,因为视图对属性具有很强的约束力。

与 VC 类型的属性相同,例如 delegates,它们是 weak 属性,因为您将类分配给该属性。显然,VC 被强烈持有,因此代表应避免强烈持有 VC 以防止保留循环(其中a 强烈持有bb 强烈持有a)。

所以回答你的问题weak 属性将在没有任何强烈要求的情况下立即释放,以上是您将使用weak 属性的场景。

【讨论】:

  • 如果你用IBOutlet连接一个视图并声明它为weak,它将在视图不再使用后被释放。如果您有一个窗口并且您更改其内容以显示另一个视图,那么旧的视图将被释放。
  • @Arc676 但这是预期的行为。除非您牢牢抓住使用视图并重复呈现它的视图控制器实例,否则您很可能每次都在初始化一个新实例。
【解决方案2】:

字符串是一个不好的例子。有些对象永远不会被释放。常量字符串、[NSNull null]、@YES 和 @NO、32 位中的小 NSNumber 值和 64 位中的许多 NSNumber 值、空数组等。由于它们没有被释放,弱变量永远不会为零。

许多对象是自动释放的。如果除了它们的自动释放池之外没有其他引用它们,那么它们会在池消失时消失。

但是如果你使用 alloc/init 创建一个对象并将其存储在一个弱变量中,编译器就会知道 alloc/init 的引用计数为 1,该引用计数被删除,然后噗!它去了。如果您首先将引用存储到默认情况下强的局部变量中,那么当代码离开局部变量的范围时它就会消失。如果先存储到弱变量中,然后立即从弱变量中存储到强变量中,则为时已晚,它已经消失了。

【讨论】:

    猜你喜欢
    • 2012-08-27
    • 1970-01-01
    • 2012-01-13
    • 2023-03-19
    • 2012-10-01
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 2012-05-04
    相关资源
    最近更新 更多