【问题标题】:View Controller doesn't dealloc when perform segue执行 segue 时视图控制器不释放
【发布时间】:2016-12-31 09:34:27
【问题描述】:

我的应用程序存在内存不断增加的问题。所以这是我的应用程序结构。我正在使用SWrevealViewController 作为幻灯片菜单。

Slidemenu
    - View Controller A
    - View Controller B
    - View Controller C

我的视图控制器 A 由 UICollectionViewScrollView 组成。 当我从视图控制器 A 到视图控制器 B 执行 segue 时,内存运行良好。但是,如果我要使用滑动菜单查看控制器 A,则内存会增加。 这是我在 SWRevealViewController 的表委托上的didSelectRowAtIndexPath。我正在使用performSegueWithIdentifier

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    if isLoggedIn {
        self.performSegueWithIdentifier(idSegueLoggedIn[indexPath.row], sender: self)
    }
}

然后我将通过滑动菜单转到视图控制器 B,然后再次转到视图控制器 A,此时内存不断增加。

看起来我的由UICollectionView 组成的视图控制器 A 没有在内存中释放它的对象。但是如果我删除我的UICollectionView,我的内存问题就会消失并且运行良好。

所以我认为这是关于我对UICollectionView 的引用。我已经用weak 属性声明了这一点,但它什么也没做。

@IBOutlet weak var othersCollectionView: UICollectionView!

我尝试在视图控件 A 中调用 deinit(),但没有调用。

这是我的内存使用图,在每个“黑色箭头”上,我通过滑动菜单移动到 View Controller A。

如果我做错了什么,请告诉我。太感谢了。

【问题讨论】:

  • 尝试在 ViewController A 中实现 deinit(),然后通过侧边菜单进入 ViewController B,如果没有调用,那么你的类还在堆栈中。再次从侧面菜单转到 ViewController A 并检查 viewDidLoad() 是否再次在 ViewController A 中被调用。如果是这样,那么你的类被加载了两次。
  • 我在 View Controller A 上声明了 deinit{print("deinit vc A")} 并从 A 到 B 到 A 到 B 到 A 到 B 广告等等,但它从未被调用。
  • deinit() 仅当 A 从堆栈中移除时才会被调用。在当前情况下,当用户从 A 类移动到 B 类时,A 类仍然保留在内存中。
  • 这是我的问题。使用 UICollectionView 的视图控制器上的 SWRevealViewController 不会减少我的堆栈

标签: ios swift memory-management uicollectionview swrevealviewcontroller


【解决方案1】:

我回答得有点晚了,但我遇到了类似的问题。最后,我的问题与某些 UITableViewCell 中的代表声明有关。我通过将委托变量声明为弱来解决了这个问题。

这是一个例子:

类 MyTableViewCell: UITableViewCell {

@IBOutlet weak var myNameTextField: UITextField!

weak var delegate: CellDbErrorDelegate?

【讨论】:

    猜你喜欢
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 2012-06-02
    • 1970-01-01
    • 2014-10-04
    相关资源
    最近更新 更多