vhesener / Closures

Swifty closures for UIKit and Foundation
MIT License
1.74k stars 146 forks source link

Clear handler? #28

Open MKGitHub opened 6 years ago

MKGitHub commented 6 years ago

Example

button.onTap(handler:{
    // do stuff
})

How do I clear this handler to avoid a leak when my VC is deallocated?

vhesener commented 6 years ago

See here: https://stablekernel.com/how-to-prevent-memory-leaks-in-swift-closures/#toc_2.

button.onTap(handler:{ [weak self] in
    self?.doStuff()
})
MKGitHub commented 6 years ago

So there is no way to clear the handler on the button?

vhesener commented 6 years ago

If you can help me understand the problem, I'll be able to help you and also help myself in order to provide the best solution for your (and other's) use case.

It just simply uses target-action, so everything is weakly held. The closure will stay around as long as you have the button strongly held by your VC, just the way that a target-action handler stays around when you use @IBAction or something.

If all you want to do is remove the handler, there are a few ways to do that right now as a work-around:

button.removeTarget(nil, action: nil, for: .touchUpInside) //removes all touch up inside events

button.onTap {} //sets the handler to do nothing

Let me know if this works or maybe what you're trying to accomplish and I'll try to assist as best I can.

smiLLe commented 6 years ago

i think he is talking about the .removeTarget. for example button.onTap { [weak self] in self?.loadData() } button.onTap { [weak self] in self?.loadData() }

if we tap the button, we load the data twice, right?

vhesener commented 6 years ago

Ah ok. Yes, I just saw this bug yesterday and fixed it. Please upgrade to v0.3, as it is fixed there.

I will leave this issue open, however, because I think it would be beneficial to have an explicit way to remove the handlers.

Good find, and thanks for the feedback!

MKGitHub commented 6 years ago

Actually I was saying if I can do this

button.onTap(handler:{
    // do stuff
})

then I would like to do this

button.removeOnTapHandler()

nikmoiseev commented 5 years ago

Hello Any news on this? I would like the block to be deleted when the object is deleted without additional code

vhesener commented 5 years ago

Objects are removed without additional code. This issue is for an enhancement to have it explicitly removed. If you are having those types of issues you'll have to post a new issue with your code so we can take a look. Likely it may be a retain cycle in your closure handler (retaining self typically).