Memory leak fixes

This commit is contained in:
Ali 2023-09-22 15:02:40 +04:00
parent 29057102ed
commit 709bcd548c
5 changed files with 29 additions and 20 deletions

View file

@ -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;

View file

@ -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<PresentationData, NoError>)? = nil, interaction: ChatListSearchInteraction, key: ChatListSearchPaneKey, peersFilter: ChatListNodePeersFilter, requestPeerType: [ReplyMarkupButtonRequestPeerType]?, location: ChatListControllerLocation, searchQuery: Signal<String?, NoError>, searchOptions: Signal<ChatListSearchOptions?, NoError>, navigationController: NavigationController?) {
self.context = context
@ -2324,15 +2326,15 @@ final class ChatListSearchListPaneNode: ASDisplayNode, ChatListSearchPaneNode {
let previousSelectedMessages = Atomic<Set<EngineMessage.Id>?>(value: nil)
let previousExpandGlobalSearch = Atomic<Bool>(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() {

View file

@ -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)

View file

@ -151,6 +151,10 @@ public final class HorizontalPeerItemNode: ListViewItemNode {
}
}
deinit {
assert(true)
}
override public func didLoad() {
super.didLoad()

View file

@ -1513,7 +1513,7 @@ private func extractAccountManagerState(records: AccountRecordsView<TelegramAcco
}
if !buildConfig.isAppStoreBuild {
if value >= 800 * 1024 * 1024 {
if value >= 2000 * 1024 * 1024 {
if self.contextValue?.context.sharedContext.immediateExperimentalUISettings.crashOnMemoryPressure == true {
preconditionFailure()
}