【问题标题】:ARC and non ARC framework - iOS - proper deallocation not working?ARC 和非 ARC 框架 - iOS - 正确解除分配不起作用?
【发布时间】:2012-02-08 10:29:37
【问题描述】:

我正在开发一个开启 arc 的 iPad 应用程序。 但我现在正在使用一个没有弧的小框架。我设置了标志 -fno_objc_arc 等等。 但是还有一个问题: 框架内的一个对象持有对当前 viewController 的引用。 如果我离开当前的 ViewController,框架会释放控制器属性:

[viewController release];

对象被释放,一切似乎都很好。但仔细观察你会发现,所有实例变量仍然有效且存在。 假设我的 viewController 有两个实例变量到实例变量 - 一个数组和一个 subviewController。通常在 arc 中,如果主对象被释放,实例变量就会被释放。但是如果非 arc 框架发送 release 消息,似乎对象并没有释放它的实例变量,导致内存错误,因为它们没有在其他任何地方引用!

编辑

这里是引用计数,表是释放的实例变量 视图控制器:

之前的控制器:1
之前的控制器实例表:1
现在 [viewController release] 已发送
之后的控制器:0
之后的控制器实例表:1

对这个问题有什么建议吗?我将不胜感激!

【问题讨论】:

    标签: objective-c ios automatic-ref-counting release-management


    【解决方案1】:

    亲爱的朋友,使用ARC并不意味着dealloc中没有发布代码。编译器在适当的地方插入发布代码,因此它还将发布代码插入到您的实例变量中,这是不可见的,因为编译器在编译时插入它,所以当您的非弧框架发送发布消息并且您的对象被释放时,我假设它的保留计数为 1,然后它的 dealloc 被调用,并且在 dealloc 中,您的实例变量也有释放代码,它也被释放(如果实例也有 1 个保留计数)



    ~~~~~~~~~~~~~~~~~~~已编辑~~~~~~~~~~~~~~~~~
    使用此代码

    NSLog(@"before release : viewController:%d  controllerTable:%d",[viewController retainCount],[controllerTable retainCount]);
    [viewController release];
    // here just give os to deallocate its memory so I'm just inserting some code which is unnessary but it may give os to reclaim the memory
    for (int i=0; i<10; i++) {
        NSLog(@"Just do nothgin here and m also sleeping it to make sure that system get enoght time to reclaim the gabaged memory");
        [NSThread sleepForTimeInterval:0.1];
    }
    //as it is crashed so commented
    //NSLog(@"after release : viewController:%d",[viewController retainCount]);
    //it should also crash now
    NSLog(@"after release : controllerTable:%d",[controllerTable retainCount]);
    

    【讨论】:

    • 是的,谢谢,它应该是这样的: 基本原理:即使 ARC 自动销毁实例变量.....(ARC Doc)但是如果 [viewController release] 被调用(在非arc框架),释放的控制器(由arc管理)的实例变量仍然存在,虽然retainCount为1-释放前后发送
    • 你检查过还是只是假设一下?
    • 我应该如何假设?我做了调试检查: po [viewController controllerTable] (gdb) print (int) [0x88be250 retainCount] $1 = 1 Now [viewController release];已发送 (gdb) print (int) [0x88be250 retainCount] $2 = 1
    • 我不明白这一点,因为我没有像这样调试...使用 NSLog(@"count : %d",[viewController retainCount]); [viewController 发布]前后;
    • 之前的控制器:1 之前的控制器实例表:1 现在 [viewController release] 在之后发送控制器:0 之后的控制器实例表:1 所以 viewCONtroller 被正确释放,但它不是实例变量 - 表
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-08
    相关资源
    最近更新 更多