在Swift Combine中使用CombineLatest时发生内存泄漏

时间:2020-04-19 15:14:01

标签: swift redux memory-leaks combine

我正在使用Redux模式来构建消息传递应用程序。到目前为止,一切工作正常,但是随后我注意到我无法解决的应用程序某些部分出现内存泄漏。我的绑定到消息发布者的视图控制器。关闭视图控制器时,不会调用Deinit。

        let messages = {
            store.$state
                .map { $0.chatState.messagesByChannel[self.channelId] }
                .removeDuplicates()
                .eraseToAnyPublisher()
        }()

        messages.combineLatest(Just("Hello world"))
            .sink { [weak self] (messages, state) in

        }
        .store(in: &cancellableSet)

当我从引用字典对象更改为处于聊天状态deinit的另一个对象时,被调用

        let chatRoomDetailResponse = {
            store.$state
            .map { $0.chatState.getChatRoomDetailResponse }
                .removeDuplicates()
                .eraseToAnyPublisher()
        }()

        chatRoomDetailResponse.combineLatest(Just("Hello world"))
            .sink { [weak self] (messages, state) in

        }
        .store(in: &cancellableSet)

这是我的商店的小快照:

final public class Store<State: FluxState>: ObservableObject {
    @Published public var state: State

    private var dispatchFunction: DispatchFunction!
    private let reducer: Reducer<State>

和我的ChatState:


public struct ChatState: FluxState {

    public typealias ChannelID = String

    public var messagesByChannel: [ChannelID: [Message]] = [:]

    public var getChatRoomDetailResponse: NetworkResponse<ChatChannel>? = nil
}

1 个答案:

答案 0 :(得分:0)

$0.chatState.messagesByChannel[self.channelId]强烈捕获self,以便能够访问其最新的channelId值。

任何一个自我弱化的人:

.map { [weak self] in 
    guard let strongSelf = self else  { return ??? }
    $0.chatState.messagesByChannel[strongSelf.channelId]
}

或者如果channelId不变,则可以使用捕获列表按值捕获它:

.map { [channelId] in $0.chatState.messagesByChannel[channelId] }