首页 文章

释放弱引用iOS

提问于
浏览
2

我正在开发一个自定义iOS SDK . 我根据自己的要求创建了弱而强大的参考资料 . 我不清楚的是: when will the weakly reference object gets de-allocated?

假设我有3个对象 A,B,C . AB 有弱引用, BC 有强引用 .

A --- >(weak ref) B --->(strong ref)C 所有3个对象都是内存中对象 . 由于 B 没有任何强引用,因此可能会取消分配 . 一旦 B 被释放, C 对象内存泄漏 . 我无法从"c"返回到"B",以防止它被取消分配,因为它可能导致保留周期 . How will ARC takes a decision to de-alloc B? 我明白当对象的最后一个强引用消失时,对象将被立即释放 . 但是没有任何对象强烈引用"B" . 在这种情况下,何时B将被解除分配?

4 回答

  • 1

    当最后一个强引用对象消失时,弱引用的对象将立即被释放 . 请注意,如果对象已被ARC保留并自动释放(实际上是创建了一个额外的临时强引用),那么这可能不完全是您的上一个强引用消失的时间 .

  • 3

    在您的示例中,由于B没有任何强引用,因此可以在任何时候(可能是立即)取消分配 . 当B被释放时,C没有任何强引用,这将导致它被解除分配,所以它不会泄漏 .

    重要的是要理解ARC不是垃圾收集,因为它不会在运行时运行进程,收集不需要的对象 . 它在编译时工作,当对象不再指向时,在代码中插入dealloc .

  • 3

    Xcode为您提供了一个提示 . 我宣布一个弱的 property :

    @property (weak) NSString *weakString;
    

    然后在 viewDidLoad 我为它分配一个值:

    self.weakString = [[NSString alloc] init];
    

    Xcode标记该行的警告说:

    Assigning retained object to weak property; object will be released after assignment

  • 0

    如果没有强烈引用“B”的对象,则“B”将被解除分配 . 但是,不确定“B”是否会立即解除分配 .

    对于ARC的情况,我假设"B"是"A"的实例变量,当"A"被释放时,B将被立即释放 . 但是,如果"B"在任何时候由ARC在 autorelease 池中注册,则"B"将在"next run loop cycle"处取消分配 .

相关问题