Comments (10)
That is just one tidbit of the implementation, if you mean SignalState
retaining the Signal
. It would still be released when it gets a termination event.
from reactiveswift.
Specifically I am confused about is this. Each signal maintains a reference to itself via its SignalState
if there is at least one observer added to the signal. So basically if I had a function like:
func f() {
let (signal, observer) = Signal<String, NoError>.pipe()
signal.observeNext { next in print(next) }
observer.sendNext("a")
}
f()
wouldn't I be leaking signal
after calling f
, since it has a reference to its itself?
from reactiveswift.
Could you point me to where the Signal is released when a terminating event is sent through? It would have to break this retain cycle, right?
from reactiveswift.
We swap out, dispose of the generator disposable and throw away the SignalState
when a termination event is received.
https://github.com/ReactiveCocoa/ReactiveSwift/blob/master/Sources/Signal.swift#L80
from reactiveswift.
Ah I see, that's a neat trick. I would still have the leak in the above example though since no interrupt, nor other terminating signal, was sent, correct?
from reactiveswift.
Yes, unless you detach the observer.
This actually falls into the caveat of this design: ReactiveCocoa/ReactiveCocoa#2959 (comment).
from reactiveswift.
In general, Signal
s should be terminated.
Even in the case where they don't, they are usually a derived "view" from something that's really permanent, and can be disposed of when no observers remain, e.g. NotificationCenter.default
and a signal of Notification
derived from it.
from reactiveswift.
Oh, awesome, thanks for the link! That's very helpful. I'm not sure there is any other way to do it really. I have been playing around with making this to get a better understanding of FRP and ReactiveCocoa and to play around with different possible APIs. I ended up with basically the same solution although it looks slightly different and mine will definitely leak if there is no terminating event even if there are no observers on the signal. You can see what I did here.
from reactiveswift.
Actually I lied, it's not quite the same. In the case above, with my implementation the Signal
would be properly deallocated since I don't care whether or not there are any observers on the Signal
. Since no one holds a reference to input observer after f()
, and the input observer holds the only strong reference to the Signal
, there is no cycle and the Signal
will be dealloc'd. Not sure of the full ramifications of a design like this are, but in this specific case something like it wouldn't leak.
from reactiveswift.
I won't comment on any other implementations. But I'd suggest you modelling the expected behavior in different circumstances as test cases. That would definitely help the iterative process, and it was how ReactiveSwift ended up with the current implementation.
from reactiveswift.
Related Issues (20)
- Release 6.6.0 requires Swift 5.3 and therefore Xcode 12.x
- Using "<~" binding function with Signal.Observers causes memory leaks. HOT 3
- Using old xcconfig causing problems with Carthage & Apple Silicon macOS builds
- Support await / AsyncSequence HOT 13
- Playground does not work HOT 1
- Hello, ask a question about Disposable, thanks HOT 1
- What's means 'targeting' in QueueScheduler? HOT 2
- Signal.merge reported issue after migrating from ReactiveSwift from 4.0.0 -> 6.6.0 HOT 2
- xCode13 CompileSwiftSources normal x86_64 com.apple.xcode.tools.swift.compiler
- Usage with SwiftUI HOT 4
- Could not find module 'ReactiveSwift' for target 'arm64-apple-ios-simulator' HOT 2
- [BUG] XCode 14 beta 3 - bitcode issue HOT 1
- Is it planned to add count argument to `collect(every:on:skipEmpty:discardWhenCompleted:)`?
- Adopt OSAllocatedUnfairLock on iOS 16 HOT 9
- Add support for mapping Property/MutableProperty types to a Binding
- Signal triggered by phone call when device is closed HOT 3
- Infinite recursion in observeSwitchToLatest() HOT 3
- EXC_BAD_ACCESS Crashes occur in xcode15 HOT 4
- Reactive Swift crash with getCache function and observeSwitchToLatest signal
- Is there any plan for future releases? HOT 3
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from reactiveswift.