在Objective C中,什么时候ARC下发布了弱对象?

时间:2015-05-13 05:42:20

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

由于引用计数变为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);
}

2 个答案:

答案 0 :(得分:0)

如果通过IBOutletdelegate / datasource 连接,则只会声明弱属性(引用另一个{{1} })。

如果你创建了一个弱属性,它将在实例化后立即释放。但是,通过UIViewController连接的weak属性不会释放,因为该视图对该属性有强烈支持。

与VC类型的属性相同,例如IBOutlet s,它们是delegate属性,因为您将类分配给属性。风险投资显然是强有力的,因此代表应避免强烈关注风险投资,以防止保留周期(weak强烈支持ab强烈支持b )。

因此,要回答您的问题,如果没有任何强烈支持,a属性将立即释放,以上是您将使用weak属性的情况

答案 1 :(得分:0)

字符串是一个糟糕的例子。有些物品永远不会被释放。常量字符串,[NSNull null],@ YES和@NO,32位的小NSNumber值和64位空数组中的许多NSNumber值,依此类推。由于它们没有被释放,弱变量永远不会是零。

许多物品都是自动释放的。如果没有别的东西引用它们而不是它们的自动释放池,它们会在游泳池消失时消失。

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