【问题标题】:Getting Leak in ARC在 ARC 中泄漏
【发布时间】:2012-12-09 23:42:48
【问题描述】:

我有一个单例对象,它是我的应用程序的一个模块,并且在此模块中创建的所有对象与任何其他模块都没有关系。我的应用程序创建了这个单例对象,并且这个对象进一步创建了它的子对象,它们没有任何类型与我的应用程序中除此模块之外的其他对象的关系。因此,在此模块任务结束后,我将此模块对象设置为nil。但是两个对象没有解除分配并显示在 xcode 的工具中。singelton 对象正确解除分配但它的两个子对象保留在内存中。

我的项目完全是 ARC。那么编译器在其父(单例对象)设置为nil 之后没有释放单例子对象的原因是什么。

提前致谢

【问题讨论】:

  • 你在使用多线程吗?
  • @RamyAlZuhouri 不,我没有使用多线程
  • 可能有一个保留周期。如果不是这个问题,请评论答案。

标签: objective-c ios ios5 automatic-ref-counting


【解决方案1】:

但是两个对象没有释放并显示在 xcode 的工具中。singelton 对象正在正确释放,但它的两个子对象保留在内存中。

我担心会有一个保留周期。
因此,例如 child1 指向 child2,反之亦然。要打破这个循环,您应该使用弱引用。
我看不到代码,所以这只是一个想法。

【讨论】:

    【解决方案2】:

    如果您在其中初始化更多对象,然后再次调用超级对象,则单例通常会出现问题。 因为单例静态变量还没有赋值。

    您可以通过执行以下操作来防止这种情况:


    单例文件

    + (SomeClass *)sharedInstance {
        if (!_someStaticInstance) {
            _someStaticInstance = [[SomeClass alloc]init];
        }
    
        return _someStaticInstance;
    }
    
    - (void)initialise {
        // do the real initialising here
    }
    

    文件创建

    [[SomeClass sharedInstance] initialise];
    

    【讨论】:

    • 你能解释一下吗?
    • @SahilWasan 更新了答案
    • 你明白我的意思吗?如果您在 init 方法中进行初始化并调用 [SomeClass sharedInstance],则单例会为您调用另一个 init,这会给您一个循环或 stackoverflow-exception。
    • @SahilWasan 好的,那你得贴一些代码,让我看看有什么问题
    • 不,我没有得到任何异常,我没有在 init 中初始化
    猜你喜欢
    • 2013-12-18
    • 2012-04-03
    • 1970-01-01
    • 2012-05-17
    • 2012-09-14
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多