Skip to content

Commit 730d272

Browse files
authored
Share replay leak (#86)
1 parent 8a070de commit 730d272

File tree

2 files changed

+29
-0
lines changed

2 files changed

+29
-0
lines changed

Sources/Subjects/ReplaySubject.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ extension ReplaySubject {
137137

138138
func forwardCompletionToBuffer(_ completion: Subscribers.Completion<Failure>) {
139139
demandBuffer?.complete(completion: completion)
140+
cancel()
140141
}
141142

142143
func request(_ demand: Subscribers.Demand) {

Tests/ShareReplayTests.swift

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,5 +213,33 @@ final class ShareReplayTests: XCTestCase {
213213
XCTAssertTrue(results.isEmpty)
214214
XCTAssertEqual(completions, [.failure(.someError)])
215215
}
216+
217+
func testSharingDoesNotRetainClassBasedPublisher() {
218+
var results = [Int]()
219+
var completions = [Subscribers.Completion<Never>]()
220+
221+
var source: PassthroughSubject? = PassthroughSubject<Int, Never>()
222+
weak var weakSource = source
223+
224+
var stream = source?.share(replay: 1)
225+
226+
stream?
227+
.sink(
228+
receiveCompletion: { completions.append($0) },
229+
receiveValue: { results.append($0) }
230+
)
231+
.store(in: &subscriptions)
232+
233+
source?.send(1)
234+
source?.send(completion: .finished)
235+
236+
subscriptions.forEach({ $0.cancel() })
237+
stream = nil
238+
source = nil
239+
240+
XCTAssertEqual(results, [1])
241+
XCTAssertEqual(completions, [.finished])
242+
XCTAssertNil(weakSource)
243+
}
216244
}
217245
#endif

0 commit comments

Comments
 (0)