Deinit never called

前端 未结 13 1776
清歌不尽
清歌不尽 2020-11-30 03:51

I\'m creating a ViewController object an pushing it to a navigation controller. When the object is being popped from the stack - it is not being release and Deinit is not be

相关标签:
13条回答
  • 2020-11-30 04:16

    I had a similar issue: I had some UIViews as arranged subviews of a *stackview" contained in a scrollview in a detail view controller. It worked when I removed the UIViews from the stackview on back button tap (willMove(toParent parent: UIViewController?)). Another thing to check is when in your view controller you have something like: let session = URLSession(configuration: .default, delegate: self, delegateQueue: OperationQueue()) (that self could in some cases prevent a detail view controller to be deallocated when you click Back and move to the master)

    0 讨论(0)
  • 2020-11-30 04:19

    add some line code of in deinit. If You put breakpoint at Empty deinit ,compiler will not stop you there put this:

    deinit {
    print("any thing")
    }
    

    It will work ;)

    0 讨论(0)
  • 2020-11-30 04:21

    I was using this tutorial Custom TabBar with a custom seque on the given page. The memory problem was due a subview which had a strong reference the the parent viewcontroller.

    class WBMNewsFeedV: UIView
    {
       var parentVC:WBMHomeTabVC!
    }
    

    WBMNewsFeedV - subclass

    parentVC:WBMHomeTabVC - parent class ViewController

    I changed it to :

    class WBMNewsFeedV: UIView
    {
        weak var parentVC:WBMHomeTabVC!
    }
    

    So, the strong reference was nested inside a subviews and not visible at first. Hope this helps anyone. After the change deinit was always called in

    WBMHomeTabVC

    0 讨论(0)
  • 2020-11-30 04:21

    Just to add an edge case which I found very difficult to detect:

    If you allocate any UnsafeMutablePointers and provide self (the UIViewController) as pointee inside of your view controller, make sure to call pointer.deinitialize(count:), not just pointer.deallocate().

    Otherwise, the reference to self will remain and the UIViewController will not deinitialize.

    0 讨论(0)
  • 2020-11-30 04:21

    I had same issue what I found is I didn't make weak reference for my other class delegate

    protocol SomeClassDelegate : AnyObject {
        func someClassDelegateMethod(<param>)
    }
    
    class SomeClass: NSObject {
    
        // Make delegate weak reference 
        weak var delegate:InfractionDataManagerDelegate? = nil
        < some code >
    }
    

    now deinit is being called on my implementation class.

    0 讨论(0)
  • 2020-11-30 04:21

    First of all make sure to define deinit

    deinit {
        print("OverlayView deinit")
    }
    

    Use Xcode's object graph to check number of instances being created and if they are not getting deallocated then they will keep growing. I was creating property of another ViewController on top of the file so i move it and place it in the scope it was being used that solved my problem. And its deinit started calling.

    Moreover i was using a uiview property to show a overlay that need to be accessed from my viewcontroller at some places i make it optional and set it nil when after calling removefromsuperview on it.

    var overlay: OverlayView?
    overlay = nil
    

    If still dealloc not calling then there could be a retain cycle issue as described above in that case you will have to check another viewcontroller(B) too if its calling back this controller(A) then set one of them as a weak variable.

    0 讨论(0)
提交回复
热议问题