【问题标题】:ARC + Dealloc is not calledARC + Dealloc 没有被调用
【发布时间】:2015-04-06 15:06:18
【问题描述】:

我有点困惑,因为我的 dealloc 没有在 ARC 中调用。我在我的应用程序中使用了故事板。

案例 1:当我使用故事板中的所有 IBOutlet 时调用 Mydealloc

案例 2:当我尝试在 UIViewController 中使用 allocinit 方法时,没有调用我的 dealloc。如下所示。

 UIViewController *vc = [[UIViewController alloc] initWithNibName:@"ProfileDetailView" bundle:nil];
        __weak ProfileDetailView *detailview = (ProfileDetailView *)vc.view;
        detailview.backgroundColor = [UIColor clearColor];
        vc = nil;
....Set value in object.....

[self.view addSubview:detailview];;
        detailview = nil;

你能解释一下为什么不调用dealloc 吗?以及我怎样才能实现调用dealloc

谢谢

【问题讨论】:

  • 使用_weak 并将变量设置为 nil 会使事情变得更加复杂。一般来说,Objective-C 在幕后处理对象的生命周期就好了。

标签: ios automatic-ref-counting dealloc


【解决方案1】:

ARC 的概念是,一个对象的保留计数理论上应该为 1,以便将其释放。执行时:

[self.view addSubview:detailview];;

您的self.viewdetailview 的保留计数添加到view.subviews 时增加1。从逻辑上讲,当self.view 删除detailview 时,保留计数减1。

同样,这是一个理论的观点。现实通常是:

疯狂。

没有人真正知道神秘的 Objective-C 运行时是如何工作的! (开个玩笑,整个源代码都可以在线获得。)

【讨论】:

  • 感谢您的回复...但在我的情况下正在发生这种情况...并且在弹出我的视图控制器后内存剩余。是的,你是对的,我需要从我的视图中删除它,但是在哪里?
  • 由于detailview_weak 并且vc 被释放,所以detail view 指向的内容没有保留。当它被添加到addSubview 时,它已经死了。
  • @Zaph:它怎么死了? detailview = nil;[self.view addSubview:detailview];; 之后调用
  • 也许这只是 INSANE,似乎 INSANE 是使 Objective-C 工作的原因。好的,detail view 保留在哪里?
  • 只要其他东西对它存在的对象有强引用。如果没有其他强引用,它会立即死亡。请注意,内存仍然存在,但在某些时候会被重用,因此它是不确定的。
【解决方案2】:

感谢您的回复。当视图控制器弹出时,我可以调用我的 dealloc 函数。为了实现这一点,我们需要在用户点击后退按钮时从我的视图中删除我添加的子视图。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多