清理键盘emoji内存高的问题

This commit is contained in:
2026-03-04 15:06:49 +08:00
parent fd5de4f197
commit 5c0cf2b435
6 changed files with 158 additions and 22 deletions

View File

@@ -41,6 +41,9 @@ FOUNDATION_EXPORT NSString * const KBEmojiRecentsDidChangeNotification;
/// 更新当前语言对应的分类标题。
- (void)refreshLocalizedTitles;
/// 释放大块缓存emoji 分类与索引),下次访问会重新加载。
- (void)purgeLargeCaches;
@end
NS_ASSUME_NONNULL_END

View File

@@ -195,6 +195,12 @@ static const NSUInteger kKBEmojiRecentsLimit = 32;
}
}
- (void)purgeLargeCaches {
self.categoriesInternal = nil;
self.itemLookup = nil;
self.recentValues = nil;
}
- (void)onLocalizationChanged:(__unused NSNotification *)note {
[self refreshLocalizedTitles];
[[NSNotificationCenter defaultCenter] postNotificationName:KBEmojiRecentsDidChangeNotification object:nil];

View File

@@ -37,15 +37,6 @@
_selectionCounts = [NSMutableDictionary dictionary];
NSArray<NSString *> *defaults = [self.class kb_defaultWords];
_priorityWords = [NSSet setWithArray:defaults];
_words = [self kb_loadWords];
_traditionalChineseWords = [self kb_loadTraditionalChineseWords];
_simplifiedChineseWords = [self kb_loadSimplifiedChineseWords];
_pinyinToTraditionalMap = [self kb_loadPinyinToTraditionalMap];
_bopomofoToChineseMap = [self kb_loadBopomofoToChineseMap];
_spanishWords = [self kb_loadSpanishWords];
_englishWords = [self kb_loadEnglishWords];
_portugueseWords = [self kb_loadPortugueseWords];
_indonesianWords = [self kb_loadIndonesianWords];
}
return self;
}
@@ -190,12 +181,16 @@
} else {
self.engineType = KBSuggestionEngineTypeLatin;
}
[self kb_trimCachesForEngineType:self.engineType];
NSLog(@"[KBSuggestionEngine] Engine type set to: %@", engineTypeString);
}
#pragma mark - English Suggestions
- (NSArray<NSString *> *)kb_englishSuggestionsForPrefix:(NSString *)prefix limit:(NSUInteger)limit {
if (!self.englishWords) {
self.englishWords = [self kb_loadEnglishWords];
}
NSArray<NSString *> *matches = [self kb_suggestionsFromWordList:self.englishWords
prefix:prefix
limit:limit];
@@ -245,6 +240,9 @@
#pragma mark - Latin Suggestions
- (NSArray<NSString *> *)kb_latinSuggestionsForPrefix:(NSString *)prefix limit:(NSUInteger)limit {
if (!self.words) {
self.words = [self kb_loadWords];
}
NSString *lower = prefix.lowercaseString;
NSMutableArray<NSString *> *matches = [NSMutableArray array];
@@ -282,6 +280,9 @@
#pragma mark - Traditional Chinese Pinyin Suggestions
- (NSArray<NSString *> *)kb_traditionalPinyinSuggestionsForPrefix:(NSString *)prefix limit:(NSUInteger)limit {
if (!self.pinyinToTraditionalMap) {
self.pinyinToTraditionalMap = [self kb_loadPinyinToTraditionalMap];
}
NSString *lower = prefix.lowercaseString;
NSMutableArray<NSString *> *matches = [NSMutableArray array];
@@ -320,6 +321,9 @@
}
- (NSArray<NSString *> *)kb_fallbackTraditionalSuggestions:(NSString *)prefix limit:(NSUInteger)limit {
if (!self.traditionalChineseWords) {
self.traditionalChineseWords = [self kb_loadTraditionalChineseWords];
}
NSMutableArray<NSString *> *matches = [NSMutableArray array];
for (NSString *word in self.traditionalChineseWords) {
[matches addObject:word];
@@ -333,6 +337,9 @@
#pragma mark - Simplified Chinese Pinyin Suggestions
- (NSArray<NSString *> *)kb_simplifiedPinyinSuggestionsForPrefix:(NSString *)prefix limit:(NSUInteger)limit {
if (!self.pinyinToTraditionalMap) {
self.pinyinToTraditionalMap = [self kb_loadPinyinToTraditionalMap];
}
NSString *lower = prefix.lowercaseString;
NSMutableArray<NSString *> *matches = [NSMutableArray array];
@@ -381,6 +388,9 @@
}
- (NSArray<NSString *> *)kb_fallbackSimplifiedSuggestions:(NSString *)prefix limit:(NSUInteger)limit {
if (!self.simplifiedChineseWords) {
self.simplifiedChineseWords = [self kb_loadSimplifiedChineseWords];
}
NSMutableArray<NSString *> *matches = [NSMutableArray array];
for (NSString *word in self.simplifiedChineseWords) {
[matches addObject:word];
@@ -447,6 +457,9 @@
#pragma mark - Bopomofo (Zhuyin) Suggestions
- (NSArray<NSString *> *)kb_bopomofoSuggestionsForPrefix:(NSString *)prefix limit:(NSUInteger)limit {
if (!self.bopomofoToChineseMap) {
self.bopomofoToChineseMap = [self kb_loadBopomofoToChineseMap];
}
NSMutableArray<NSString *> *matches = [NSMutableArray array];
NSArray<NSString *> *directMatches = self.bopomofoToChineseMap[prefix];
@@ -606,6 +619,9 @@
#pragma mark - Spanish Suggestions
- (NSArray<NSString *> *)kb_spanishSuggestionsForPrefix:(NSString *)prefix limit:(NSUInteger)limit {
if (!self.spanishWords) {
self.spanishWords = [self kb_loadSpanishWords];
}
NSArray<NSString *> *matches = [self kb_suggestionsFromWordList:self.spanishWords
prefix:prefix
limit:limit];
@@ -655,6 +671,9 @@
#pragma mark - Portuguese Suggestions
- (NSArray<NSString *> *)kb_portugueseSuggestionsForPrefix:(NSString *)prefix limit:(NSUInteger)limit {
if (!self.portugueseWords) {
self.portugueseWords = [self kb_loadPortugueseWords];
}
NSArray<NSString *> *matches = [self kb_suggestionsFromWordList:self.portugueseWords
prefix:prefix
limit:limit];
@@ -704,6 +723,9 @@
#pragma mark - Indonesian Suggestions
- (NSArray<NSString *> *)kb_indonesianSuggestionsForPrefix:(NSString *)prefix limit:(NSUInteger)limit {
if (!self.indonesianWords) {
self.indonesianWords = [self kb_loadIndonesianWords];
}
NSArray<NSString *> *matches = [self kb_suggestionsFromWordList:self.indonesianWords
prefix:prefix
limit:limit];
@@ -784,4 +806,78 @@
return matches.copy;
}
- (void)kb_trimCachesForEngineType:(KBSuggestionEngineType)engineType {
switch (engineType) {
case KBSuggestionEngineTypeEnglish:
self.spanishWords = nil;
self.portugueseWords = nil;
self.indonesianWords = nil;
self.words = nil;
self.traditionalChineseWords = nil;
self.simplifiedChineseWords = nil;
self.pinyinToTraditionalMap = nil;
self.bopomofoToChineseMap = nil;
break;
case KBSuggestionEngineTypeSpanish:
self.englishWords = nil;
self.portugueseWords = nil;
self.indonesianWords = nil;
self.words = nil;
self.traditionalChineseWords = nil;
self.simplifiedChineseWords = nil;
self.pinyinToTraditionalMap = nil;
self.bopomofoToChineseMap = nil;
break;
case KBSuggestionEngineTypePortuguese:
self.englishWords = nil;
self.spanishWords = nil;
self.indonesianWords = nil;
self.words = nil;
self.traditionalChineseWords = nil;
self.simplifiedChineseWords = nil;
self.pinyinToTraditionalMap = nil;
self.bopomofoToChineseMap = nil;
break;
case KBSuggestionEngineTypeIndonesian:
self.englishWords = nil;
self.spanishWords = nil;
self.portugueseWords = nil;
self.words = nil;
self.traditionalChineseWords = nil;
self.simplifiedChineseWords = nil;
self.pinyinToTraditionalMap = nil;
self.bopomofoToChineseMap = nil;
break;
case KBSuggestionEngineTypePinyinTraditional:
case KBSuggestionEngineTypePinyinSimplified:
self.words = nil;
self.englishWords = nil;
self.spanishWords = nil;
self.portugueseWords = nil;
self.indonesianWords = nil;
self.bopomofoToChineseMap = nil;
break;
case KBSuggestionEngineTypeBopomofo:
self.words = nil;
self.englishWords = nil;
self.spanishWords = nil;
self.portugueseWords = nil;
self.indonesianWords = nil;
self.pinyinToTraditionalMap = nil;
self.simplifiedChineseWords = nil;
break;
case KBSuggestionEngineTypeLatin:
default:
self.englishWords = nil;
self.spanishWords = nil;
self.portugueseWords = nil;
self.indonesianWords = nil;
self.traditionalChineseWords = nil;
self.simplifiedChineseWords = nil;
self.pinyinToTraditionalMap = nil;
self.bopomofoToChineseMap = nil;
break;
}
}
@end