From 709bcd548c576b940279610f4e9f10dd3675c11d Mon Sep 17 00:00:00 2001 From: Ali <> Date: Fri, 22 Sep 2023 15:02:40 +0400 Subject: [PATCH] Memory leak fixes --- .../Source/ASEditableTextNode.mm | 4 +- .../Sources/ChatListSearchListPaneNode.swift | 37 +++++++++++-------- .../Sources/Items/ChatImageGalleryItem.swift | 2 +- .../Sources/HorizontalPeerItem.swift | 4 ++ .../TelegramUI/Sources/AppDelegate.swift | 2 +- 5 files changed, 29 insertions(+), 20 deletions(-) diff --git a/submodules/AsyncDisplayKit/Source/ASEditableTextNode.mm b/submodules/AsyncDisplayKit/Source/ASEditableTextNode.mm index 9dbdff9cee..ba05b9d895 100644 --- a/submodules/AsyncDisplayKit/Source/ASEditableTextNode.mm +++ b/submodules/AsyncDisplayKit/Source/ASEditableTextNode.mm @@ -376,7 +376,7 @@ __strong ASEditableTextNode *strongSelf = weakSelf; if (strongSelf != nil) { if ([strongSelf->_delegate respondsToSelector:@selector(editableTextNodeShouldCopy:)]) { - return [strongSelf->_delegate editableTextNodeShouldCopy:self]; + return [strongSelf->_delegate editableTextNodeShouldCopy:strongSelf]; } } return true; @@ -385,7 +385,7 @@ __strong ASEditableTextNode *strongSelf = weakSelf; if (strongSelf != nil) { if ([strongSelf->_delegate respondsToSelector:@selector(editableTextNodeShouldPaste:)]) { - return [strongSelf->_delegate editableTextNodeShouldPaste:self]; + return [strongSelf->_delegate editableTextNodeShouldPaste:strongSelf]; } } return true; diff --git a/submodules/ChatListUI/Sources/ChatListSearchListPaneNode.swift b/submodules/ChatListUI/Sources/ChatListSearchListPaneNode.swift index 9eddb113e4..4d8b8c8ec6 100644 --- a/submodules/ChatListUI/Sources/ChatListSearchListPaneNode.swift +++ b/submodules/ChatListUI/Sources/ChatListSearchListPaneNode.swift @@ -1074,6 +1074,8 @@ final class ChatListSearchListPaneNode: ASDisplayNode, ChatListSearchPaneNode { } private var hiddenMediaDisposable: Disposable? + private var searchQueryDisposable: Disposable? + private var searchOptionsDisposable: Disposable? init(context: AccountContext, animationCache: AnimationCache, animationRenderer: MultiAnimationRenderer, updatedPresentationData: (initial: PresentationData, signal: Signal)? = nil, interaction: ChatListSearchInteraction, key: ChatListSearchPaneKey, peersFilter: ChatListNodePeersFilter, requestPeerType: [ReplyMarkupButtonRequestPeerType]?, location: ChatListControllerLocation, searchQuery: Signal, searchOptions: Signal, navigationController: NavigationController?) { self.context = context @@ -2324,15 +2326,15 @@ final class ChatListSearchListPaneNode: ASDisplayNode, ChatListSearchPaneNode { let previousSelectedMessages = Atomic?>(value: nil) let previousExpandGlobalSearch = Atomic(value: false) - let _ = (searchQuery - |> deliverOnMainQueue).startStandalone(next: { [weak self, weak listInteraction, weak chatListInteraction] query in + self.searchQueryDisposable = (searchQuery + |> deliverOnMainQueue).startStrict(next: { [weak self, weak listInteraction, weak chatListInteraction] query in self?.searchQueryValue = query listInteraction?.searchTextHighightState = query chatListInteraction?.searchTextHighightState = query }) - let _ = (searchOptions - |> deliverOnMainQueue).startStandalone(next: { [weak self] options in + self.searchOptionsDisposable = (searchOptions + |> deliverOnMainQueue).startStrict(next: { [weak self] options in self?.searchOptionsValue = options }) @@ -2682,6 +2684,7 @@ final class ChatListSearchListPaneNode: ASDisplayNode, ChatListSearchPaneNode { } if [.file, .music, .voiceOrInstantVideo].contains(tagMask) || self.key == .downloads { + let key = self.key self.mediaStatusDisposable = (context.sharedContext.mediaManager.globalMediaPlayerState |> mapToSignal { playlistStateAndType -> Signal<(Account, SharedMediaPlayerItemPlaybackState, MediaManagerPlayerType)?, NoError> in if let (account, state, type) = playlistStateAndType { @@ -2694,7 +2697,7 @@ final class ChatListSearchListPaneNode: ASDisplayNode, ChatListSearchPaneNode { return .single(nil) |> delay(0.2, queue: .mainQueue()) } case .music: - if tagMask != .music && self.key != .downloads { + if tagMask != .music && key != .downloads { return .single(nil) |> delay(0.2, queue: .mainQueue()) } case .file: @@ -2714,26 +2717,26 @@ final class ChatListSearchListPaneNode: ASDisplayNode, ChatListSearchPaneNode { } } |> deliverOnMainQueue).startStrict(next: { [weak self] playlistStateAndType in - guard let strongSelf = self else { + guard let self else { return } - if !arePlaylistItemsEqual(strongSelf.playlistStateAndType?.0, playlistStateAndType?.1.item) || - !arePlaylistItemsEqual(strongSelf.playlistStateAndType?.1, playlistStateAndType?.1.previousItem) || - !arePlaylistItemsEqual(strongSelf.playlistStateAndType?.2, playlistStateAndType?.1.nextItem) || - strongSelf.playlistStateAndType?.3 != playlistStateAndType?.1.order || strongSelf.playlistStateAndType?.4 != playlistStateAndType?.2 { + if !arePlaylistItemsEqual(self.playlistStateAndType?.0, playlistStateAndType?.1.item) || + !arePlaylistItemsEqual(self.playlistStateAndType?.1, playlistStateAndType?.1.previousItem) || + !arePlaylistItemsEqual(self.playlistStateAndType?.2, playlistStateAndType?.1.nextItem) || + self.playlistStateAndType?.3 != playlistStateAndType?.1.order || self.playlistStateAndType?.4 != playlistStateAndType?.2 { if let playlistStateAndType = playlistStateAndType { - strongSelf.playlistStateAndType = (playlistStateAndType.1.item, playlistStateAndType.1.previousItem, playlistStateAndType.1.nextItem, playlistStateAndType.1.order, playlistStateAndType.2, playlistStateAndType.0) + self.playlistStateAndType = (playlistStateAndType.1.item, playlistStateAndType.1.previousItem, playlistStateAndType.1.nextItem, playlistStateAndType.1.order, playlistStateAndType.2, playlistStateAndType.0) } else { - strongSelf.playlistStateAndType = nil + self.playlistStateAndType = nil } - if let (size, sideInset, bottomInset, visibleHeight, presentationData) = strongSelf.currentParams { - strongSelf.update(size: size, sideInset: sideInset, bottomInset: bottomInset, visibleHeight: visibleHeight, presentationData: presentationData, synchronous: true, transition: .animated(duration: 0.4, curve: .spring)) + if let (size, sideInset, bottomInset, visibleHeight, presentationData) = self.currentParams { + self.update(size: size, sideInset: sideInset, bottomInset: bottomInset, visibleHeight: visibleHeight, presentationData: presentationData, synchronous: true, transition: .animated(duration: 0.4, curve: .spring)) } } - strongSelf.playlistLocation = playlistStateAndType?.1.playlistLocation - }).strict() + self.playlistLocation = playlistStateAndType?.1.playlistLocation + }) } self.deletedMessagesDisposable = (context.account.stateManager.deletedMessages @@ -2770,6 +2773,8 @@ final class ChatListSearchListPaneNode: ASDisplayNode, ChatListSearchPaneNode { self.recentDisposable.dispose() self.updatedRecentPeersDisposable.dispose() self.deletedMessagesDisposable?.dispose() + self.searchQueryDisposable?.dispose() + self.searchOptionsDisposable?.dispose() } override func didLoad() { diff --git a/submodules/GalleryUI/Sources/Items/ChatImageGalleryItem.swift b/submodules/GalleryUI/Sources/Items/ChatImageGalleryItem.swift index 3cfe8427e6..771ebbcecf 100644 --- a/submodules/GalleryUI/Sources/Items/ChatImageGalleryItem.swift +++ b/submodules/GalleryUI/Sources/Items/ChatImageGalleryItem.swift @@ -1236,7 +1236,7 @@ extension UIBezierPath { } private func generateMaskImage(size: CGSize, recognitions: [RecognizedContent]) -> UIImage? { - return generateImage(size, opaque: false, rotatedContext: { size, c in + return generateImage(size, opaque: false, scale: 1.0, rotatedContext: { size, c in let bounds = CGRect(origin: CGPoint(), size: size) c.clear(bounds) diff --git a/submodules/HorizontalPeerItem/Sources/HorizontalPeerItem.swift b/submodules/HorizontalPeerItem/Sources/HorizontalPeerItem.swift index 0e4e98ab49..fdd6ded187 100644 --- a/submodules/HorizontalPeerItem/Sources/HorizontalPeerItem.swift +++ b/submodules/HorizontalPeerItem/Sources/HorizontalPeerItem.swift @@ -151,6 +151,10 @@ public final class HorizontalPeerItemNode: ListViewItemNode { } } + deinit { + assert(true) + } + override public func didLoad() { super.didLoad() diff --git a/submodules/TelegramUI/Sources/AppDelegate.swift b/submodules/TelegramUI/Sources/AppDelegate.swift index 166e408694..90a1cb8688 100644 --- a/submodules/TelegramUI/Sources/AppDelegate.swift +++ b/submodules/TelegramUI/Sources/AppDelegate.swift @@ -1513,7 +1513,7 @@ private func extractAccountManagerState(records: AccountRecordsView= 800 * 1024 * 1024 { + if value >= 2000 * 1024 * 1024 { if self.contextValue?.context.sharedContext.immediateExperimentalUISettings.crashOnMemoryPressure == true { preconditionFailure() }