From 9e86628b8f6570b389c2c8b04a6eaa0b2a3926dd Mon Sep 17 00:00:00 2001 From: "song.meng" Date: Sat, 4 Jul 2020 19:10:40 +0800 Subject: [PATCH 1/5] update pod --- Podfile.lock | 16 +++++++-------- .../xcschemes/xcschememanagement.plist | 19 ++++++++++++++++++ .../UserInterfaceState.xcuserstate | Bin 0 -> 42261 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 6 ++++++ 4 files changed, 33 insertions(+), 8 deletions(-) create mode 100644 SVGAPlayer.xcodeproj/xcuserdata/momo.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 SVGAPlayer.xcworkspace/xcuserdata/momo.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 SVGAPlayer.xcworkspace/xcuserdata/momo.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist diff --git a/Podfile.lock b/Podfile.lock index c78a8c2c..46ef050d 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,5 +1,5 @@ PODS: - - Protobuf (3.6.1) + - Protobuf (3.12.0) - React/ART (0.45.1): - React/Core - React/Core (0.45.1): @@ -27,8 +27,8 @@ PODS: - React/Core - React/RCTWebSocket (0.45.1): - React/Core - - SSZipArchive (2.1.4) - - Yoga (1.9.0) + - SSZipArchive (2.1.5) + - Yoga (1.14.0) DEPENDENCIES: - Protobuf (~> 3.4) @@ -47,7 +47,7 @@ DEPENDENCIES: - Yoga SPEC REPOS: - https://github.com/cocoapods/specs.git: + trunk: - Protobuf - SSZipArchive - Yoga @@ -57,11 +57,11 @@ EXTERNAL SOURCES: :podspec: https://raw.githubusercontent.com/yyued/react-native-runtime-ios/0.45.1/React.podspec SPEC CHECKSUMS: - Protobuf: 1eb9700044745f00181c136ef21b8ff3ad5a0fd5 + Protobuf: 2793fcd0622a00b546c60e7cbbcc493e043e9bb9 React: 505e0132cd9aaba1a56e47ef509220dd794ec9be - SSZipArchive: 41455d4b8d2b6ab93990820b50dc697c2554a322 - Yoga: aaae8abea68951f60bee05f6277d3eed90bb91bb + SSZipArchive: cefe1364104a0231268a5deb8495bdf2861f52f0 + Yoga: cff67a400f6b74dc38eb0bad4f156673d9aa980c PODFILE CHECKSUM: 7f6714245d47e69d2933463289e4c4d6de65b831 -COCOAPODS: 1.7.4 +COCOAPODS: 1.9.1 diff --git a/SVGAPlayer.xcodeproj/xcuserdata/momo.xcuserdatad/xcschemes/xcschememanagement.plist b/SVGAPlayer.xcodeproj/xcuserdata/momo.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 00000000..1a7b4228 --- /dev/null +++ b/SVGAPlayer.xcodeproj/xcuserdata/momo.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,19 @@ + + + + + SchemeUserState + + SVGAPlayer React.xcscheme_^#shared#^_ + + orderHint + 7 + + SVGAPlayer.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/SVGAPlayer.xcworkspace/xcuserdata/momo.xcuserdatad/UserInterfaceState.xcuserstate b/SVGAPlayer.xcworkspace/xcuserdata/momo.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..8e84bfa582896cd6d74e076e621a3287258804ef GIT binary patch literal 42261 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

}2C7 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 + + From 30c1b3047c197883069d21df082e014c0118a2bc Mon Sep 17 00:00:00 2001 From: "song.meng" Date: Sat, 4 Jul 2020 22:22:33 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E5=8D=95=E4=BE=8B=EF=BC=9B=E6=B7=BB=E5=8A=A0=E5=86=85=E5=AD=98?= =?UTF-8?q?=E5=8D=A0=E7=94=A8=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SVGAPlayer.xcodeproj/project.pbxproj | 18 ++ .../UserInterfaceState.xcuserstate | Bin 42261 -> 49742 bytes Source/SVGAParser+mm.h | 17 ++ Source/SVGAParser+mm.m | 20 ++ Source/SVGAVideoEntity+mm.h | 23 +++ Source/SVGAVideoEntity+mm.m | 85 +++++++++ Source/SVGAVideoMemoryCache.h | 45 +++++ Source/SVGAVideoMemoryCache.m | 177 ++++++++++++++++++ 8 files changed, 385 insertions(+) create mode 100644 Source/SVGAParser+mm.h create mode 100644 Source/SVGAParser+mm.m create mode 100644 Source/SVGAVideoEntity+mm.h create mode 100644 Source/SVGAVideoEntity+mm.m create mode 100644 Source/SVGAVideoMemoryCache.h create mode 100644 Source/SVGAVideoMemoryCache.m diff --git a/SVGAPlayer.xcodeproj/project.pbxproj b/SVGAPlayer.xcodeproj/project.pbxproj index d9bf999d..8523ff91 100644 --- a/SVGAPlayer.xcodeproj/project.pbxproj +++ b/SVGAPlayer.xcodeproj/project.pbxproj @@ -58,6 +58,9 @@ 90D7CA1C1F7FB114006E74F0 /* rose_1.5.0.svga in Resources */ = {isa = PBXBuildFile; fileRef = 90D7CA1A1F7FB114006E74F0 /* rose_1.5.0.svga */; }; 90D7CA1E1F7FB34E006E74F0 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 90D7CA1D1F7FB34E006E74F0 /* libz.tbd */; }; 90DB59B51F96026E00894727 /* SVGAImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 90DB59B41F96026E00894727 /* SVGAImageView.m */; }; + FA7FA4DF24B09BE600413DF0 /* SVGAVideoMemoryCache.m in Sources */ = {isa = PBXBuildFile; fileRef = FA7FA4DE24B09BE600413DF0 /* SVGAVideoMemoryCache.m */; }; + FA7FA4E224B0B66500413DF0 /* SVGAVideoEntity+mm.m in Sources */ = {isa = PBXBuildFile; fileRef = FA7FA4E124B0B66500413DF0 /* SVGAVideoEntity+mm.m */; }; + FA7FA4E524B0C36A00413DF0 /* SVGAParser+mm.m in Sources */ = {isa = PBXBuildFile; fileRef = FA7FA4E424B0C36A00413DF0 /* SVGAParser+mm.m */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -119,6 +122,12 @@ 90DB59B41F96026E00894727 /* SVGAImageView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SVGAImageView.m; sourceTree = ""; }; 92332F7A897BF4379D765B05 /* libPods-SVGAPlayer React.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-SVGAPlayer React.a"; sourceTree = BUILT_PRODUCTS_DIR; }; E02B8713B25C0283C736EE03 /* Pods-SVGAPlayer.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SVGAPlayer.release.xcconfig"; path = "Pods/Target Support Files/Pods-SVGAPlayer/Pods-SVGAPlayer.release.xcconfig"; sourceTree = ""; }; + FA7FA4DD24B09BE600413DF0 /* SVGAVideoMemoryCache.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SVGAVideoMemoryCache.h; sourceTree = ""; }; + FA7FA4DE24B09BE600413DF0 /* SVGAVideoMemoryCache.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SVGAVideoMemoryCache.m; sourceTree = ""; }; + FA7FA4E024B0B66500413DF0 /* SVGAVideoEntity+mm.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SVGAVideoEntity+mm.h"; sourceTree = ""; }; + FA7FA4E124B0B66500413DF0 /* SVGAVideoEntity+mm.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "SVGAVideoEntity+mm.m"; sourceTree = ""; }; + FA7FA4E324B0C36A00413DF0 /* SVGAParser+mm.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SVGAParser+mm.h"; sourceTree = ""; }; + FA7FA4E424B0C36A00413DF0 /* SVGAParser+mm.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "SVGAParser+mm.m"; sourceTree = ""; }; FF89C40C3E9839DA5DE71191 /* Pods-SVGAPlayer React.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SVGAPlayer React.release.xcconfig"; path = "Pods/Target Support Files/Pods-SVGAPlayer React/Pods-SVGAPlayer React.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -233,6 +242,12 @@ 9052FC621E6EB8D4007BC925 /* SVGAExporter.m */, 904D41F61D223DD20085A21A /* SVGABezierPath.h */, 904D41F71D223DD20085A21A /* SVGABezierPath.m */, + FA7FA4DD24B09BE600413DF0 /* SVGAVideoMemoryCache.h */, + FA7FA4DE24B09BE600413DF0 /* SVGAVideoMemoryCache.m */, + FA7FA4E024B0B66500413DF0 /* SVGAVideoEntity+mm.h */, + FA7FA4E124B0B66500413DF0 /* SVGAVideoEntity+mm.m */, + FA7FA4E324B0C36A00413DF0 /* SVGAParser+mm.h */, + FA7FA4E424B0C36A00413DF0 /* SVGAParser+mm.m */, ); path = Source; sourceTree = ""; @@ -434,6 +449,7 @@ buildActionMask = 2147483647; files = ( 90A676E81D13A6DF008A69F3 /* ViewController.m in Sources */, + FA7FA4DF24B09BE600413DF0 /* SVGAVideoMemoryCache.m in Sources */, 9052FC631E6EB8D4007BC925 /* SVGAExporter.m in Sources */, 90A677031D13AE19008A69F3 /* SVGAVideoEntity.m in Sources */, 90A364DA1E5AED04009347F1 /* SVGAVideoSpriteFrameEntity.m in Sources */, @@ -449,7 +465,9 @@ 90A677061D13BF77008A69F3 /* SVGAPlayer.m in Sources */, 90A364D41E5AEC1C009347F1 /* SVGAVectorLayer.m in Sources */, 90D7CA161F7FA07A006E74F0 /* Svga.pbobjc.m in Sources */, + FA7FA4E224B0B66500413DF0 /* SVGAVideoEntity+mm.m in Sources */, 90A676E21D13A6DF008A69F3 /* main.m in Sources */, + FA7FA4E524B0C36A00413DF0 /* SVGAParser+mm.m in Sources */, 90A676FD1D13A82A008A69F3 /* SVGAParser.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/SVGAPlayer.xcworkspace/xcuserdata/momo.xcuserdatad/UserInterfaceState.xcuserstate b/SVGAPlayer.xcworkspace/xcuserdata/momo.xcuserdatad/UserInterfaceState.xcuserstate index 8e84bfa582896cd6d74e076e621a3287258804ef..8e0a558f96a72a522a76b6c3bd0a7f4e6367b7a9 100644 GIT binary patch delta 23836 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

Ko+`&;dH)mpMUa=mNXL9$HS&f-Vwu!yVP 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 RcK(*7bsh-q{53t}{{U&BeHZ`$ diff --git a/Source/SVGAParser+mm.h b/Source/SVGAParser+mm.h new file mode 100644 index 00000000..69e2efb3 --- /dev/null +++ b/Source/SVGAParser+mm.h @@ -0,0 +1,17 @@ +// +// SVGAParser+mm.h +// SVGAPlayer +// +// Created by MOMO on 2020/7/4. +// Copyright © 2020 UED Center. All rights reserved. +// + +#import "SVGAParser.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface SVGAParser (mm) + +@end + +NS_ASSUME_NONNULL_END diff --git a/Source/SVGAParser+mm.m b/Source/SVGAParser+mm.m new file mode 100644 index 00000000..87b22162 --- /dev/null +++ b/Source/SVGAParser+mm.m @@ -0,0 +1,20 @@ +// +// SVGAParser+mm.m +// SVGAPlayer +// +// Created by MOMO on 2020/7/4. +// Copyright © 2020 UED Center. All rights reserved. +// + +#import "SVGAParser+mm.h" + +@implementation SVGAParser (mm) + +- (instancetype)init{ + if (self = [super init]) { + self.enabledMemoryCache = YES; + } + return self; +} + +@end diff --git a/Source/SVGAVideoEntity+mm.h b/Source/SVGAVideoEntity+mm.h new file mode 100644 index 00000000..5924c654 --- /dev/null +++ b/Source/SVGAVideoEntity+mm.h @@ -0,0 +1,23 @@ +// +// SVGAVideoEntity+mm.h +// SVGAPlayer +// +// Created by MOMO on 2020/7/4. +// Copyright © 2020 UED Center. All rights reserved. +// + +#import "SVGAVideoEntity.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface SVGAVideoEntity (mm) + +/// 返回内存占用情况 +- (NSUInteger)getMemoryCost; + +/// 重置内存占用计算 +- (void)resetMemoryCost; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Source/SVGAVideoEntity+mm.m b/Source/SVGAVideoEntity+mm.m new file mode 100644 index 00000000..441ebda3 --- /dev/null +++ b/Source/SVGAVideoEntity+mm.m @@ -0,0 +1,85 @@ +// +// SVGAVideoEntity+mm.m +// SVGAPlayer +// +// Created by MOMO on 2020/7/4. +// Copyright © 2020 UED Center. All rights reserved. +// + +#import "SVGAVideoEntity+mm.h" +#import "SVGAVideoMemoryCache.h" +#import + +@interface SVGAVideoEntity() + +@property (nonatomic, assign) NSUInteger mmMemoryCost; + +@end + + +@implementation SVGAVideoEntity (mm) +static char mmMemoryCostKey; + +/// 方法重写 ++ (SVGAVideoEntity *)readCache:(NSString *)cacheKey { + return [[SVGAVideoMemoryCache sharedCache] objectForKey:cacheKey]; +} + +/// 方法重写 +- (void)saveCache:(NSString *)cacheKey { + [[SVGAVideoMemoryCache sharedCache] setObject:self forKey:cacheKey]; +} + + + +/// 返回内存占用情况 +- (NSUInteger)getMemoryCost { + id obj = objc_getAssociatedObject(self, &mmMemoryCostKey); + if (obj) { + return self.mmMemoryCost; + } + + [self resetMemoryCost]; + NSLog(@"======= %lu M", self.mmMemoryCost/1024/1024); + return self.mmMemoryCost; +} + +/// 重置内存占用计算 +- (void)resetMemoryCost { + if (!self.images) { + return; + } + + [self.images enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull key, UIImage * _Nonnull obj, BOOL * _Nonnull stop) { + if ([obj isKindOfClass:[UIImage class]]) { + NSUInteger cost = [self costForImage:obj]; + self.mmMemoryCost += cost; + } + }]; + NSLog(@"------ %lu , image count:%ld", self.mmMemoryCost, self.images.count); +} + +- (NSUInteger)costForImage:(UIImage *)image { + CGImageRef imageRef = image.CGImage; + if (!imageRef) { + return 0; + } + NSUInteger bytesPerFrame = CGImageGetBytesPerRow(imageRef) * CGImageGetHeight(imageRef); + NSUInteger frameCount = image.images.count > 0 ? image.images.count : 1; + return bytesPerFrame * frameCount; +} + +- (void)setMmMemoryCost:(NSUInteger)mmMemoryCost { + objc_setAssociatedObject(self, &mmMemoryCostKey, @(mmMemoryCost), OBJC_ASSOCIATION_RETAIN); +} + +- (NSUInteger)mmMemoryCost { + id obj = objc_getAssociatedObject(self, &mmMemoryCostKey); + if ([obj respondsToSelector:@selector(unsignedIntegerValue)]) { + return [obj unsignedIntegerValue]; + } + return 0; +} + + +@end diff --git a/Source/SVGAVideoMemoryCache.h b/Source/SVGAVideoMemoryCache.h new file mode 100644 index 00000000..0d1bd17a --- /dev/null +++ b/Source/SVGAVideoMemoryCache.h @@ -0,0 +1,45 @@ +// +// SVGAVideoMemoryCache.h +// SVGAPlayer +// +// Created by MOMO@song.meng on 2020/7/4. +// Copyright © 2020 UED Center. All rights reserved. +// +// 用于处理SVGA内存缓存 +// + +#import +#import "SVGAVideoEntity.h" +#import "SVGAVideoEntity+mm.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface SVGAVideoMemoryCache : NSObject + + +/// 是否显示内存占用tip,开启统计后才生效,默认为NO +@property (nonatomic, assign) BOOL showMemoryCostTip; +@property (nonatomic, assign) CGRect memoryCostTipFrame; + +/// 内存使用限制 +@property (nonatomic, assign) NSUInteger memoryCostLimit; + +/// 内存使用情况,在statisticsMemoryCost为YES的情况下有效 +@property (nonatomic, readonly) NSUInteger totalMemoryCost; + +/// 内存缓存是否生效,默认为YES,为NO时将使用weak缓存 +/// 以避免同一时刻多个SVGAPlayer使用同一资源造成重复的内存占用 +/// 关闭后内存使用统计和内存占用提示将失效 +@property (nonatomic, assign) BOOL memoryCacheEnable; + ++ (instancetype)sharedCache; + + +- (void)setObject:(SVGAVideoEntity *)object forKey:(id)key; +- (SVGAVideoEntity *)objectForKey:(id)key; +- (void)removeAllObjects; +- (void)removeObjectForKey:(id)key; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Source/SVGAVideoMemoryCache.m b/Source/SVGAVideoMemoryCache.m new file mode 100644 index 00000000..f515f3bd --- /dev/null +++ b/Source/SVGAVideoMemoryCache.m @@ -0,0 +1,177 @@ +// +// SVGAVideoMemoryCache.m +// SVGAPlayer +// +// Created by MOMO@song.meng on 2020/7/4. +// Copyright © 2020 UED Center. All rights reserved. +// +// 用于处理SVGA内存缓存 +// + + +#import "SVGAVideoMemoryCache.h" + +@interface SVGAVideoMemoryCache() + +@property (nonatomic, strong) NSCache *strongCache; +@property (nonatomic, strong) NSMapTable *weakCache; +@property (nonatomic, readwrite) NSUInteger totalMemoryCost; +@property (nonatomic, strong) dispatch_semaphore_t dispatchLock; +/// 内存占用Tip +@property (nonatomic, strong) UILabel *memoryCostTip; + +@end + +@implementation SVGAVideoMemoryCache + +static SVGAVideoMemoryCache *instance; ++ (instancetype)sharedCache { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + instance = [[SVGAVideoMemoryCache alloc] init]; + }); + return instance; +} + +- (instancetype)init { + if (self = [super init]) { + [self cutomeInit]; + } + + return self; +} + +- (void)cutomeInit { + _memoryCostTipFrame = CGRectMake(10, 100, 150, 15); + _weakCache = [[NSMapTable alloc] initWithKeyOptions:NSPointerFunctionsWeakMemory valueOptions:NSPointerFunctionsStrongMemory capacity:128]; + _dispatchLock = dispatch_semaphore_create(1); + _memoryCacheEnable = YES; + +#ifdef DEBUG + _showMemoryCostTip = YES; +#endif +} + +#pragma mark - public + +- (void)setObject:(SVGAVideoEntity *)object forKey:(id)key { + if (object && key) { + [self saveStrongCache:object forKey:key]; + + dispatch_semaphore_wait(_dispatchLock, DISPATCH_TIME_FOREVER); + [self.weakCache setObject:object forKey:key]; + dispatch_semaphore_signal(_dispatchLock); + } +} + +- (SVGAVideoEntity *)objectForKey:(id)key { + id obj = [self.strongCache objectForKey:key]; + if (!obj) { + obj = [self.weakCache objectForKey:key]; + if ([obj isKindOfClass:[SVGAVideoEntity class]]) { + [self saveStrongCache:obj forKey:key]; + return obj; + } + } + + return nil; +} + +- (void)removeAllObjects { + if (_memoryCacheEnable) { + [self.strongCache removeAllObjects]; + self.totalMemoryCost = 0; + } +} + +- (void)removeObjectForKey:(id)key { + SVGAVideoEntity * obj = [self objectForKey:key]; + if (obj) { + self.totalMemoryCost -= [obj getMemoryCost]; + } + + [self.strongCache removeObjectForKey:key]; +} + + +#pragma mark - ptivate + +- (SVGAVideoEntity *)readStrongCache:(id)key { + if (_memoryCacheEnable) { + return [self.strongCache objectForKey:key]; + } + return nil; +} + +- (void)saveStrongCache:(SVGAVideoEntity *)object forKey:(id)key { + if (_memoryCacheEnable) { + if ([self.strongCache objectForKey:key]) { + return; + } + NSUInteger cost = [object getMemoryCost]; + [self.strongCache setObject:object forKey:key cost:cost]; + self.totalMemoryCost += cost; + } +} + + +#pragma mark - NSCache delegate + +/// NSCache将要移除元素 +- (void)cache:(NSCache *)cache willEvictObject:(id)obj { + SVGAVideoEntity * ent = (SVGAVideoEntity *)obj; + self.totalMemoryCost -= [ent getMemoryCost]; +} + +#pragma mark - setter & getter + +- (void)setTotalMemoryCost:(NSUInteger)totalMemoryCost { + _totalMemoryCost = totalMemoryCost; + + if (_showMemoryCostTip) { + void(^showTip)() = ^{ + NSString * tip = [NSString stringWithFormat:@"svga cost: %.2fM",_totalMemoryCost/1024.f/1024.f]; + self.memoryCostTip.text = tip; + if (!self.memoryCostTip.superview) { + [[UIApplication sharedApplication].keyWindow addSubview:self.memoryCostTip]; + } + }; + if ([NSThread isMainThread]) { + showTip(); + } else { + dispatch_async(dispatch_get_main_queue(), showTip); + } + } else if (self.memoryCostTip && self.memoryCostTip.superview) { + void(^removeView)() = ^{ + [self.memoryCostTip removeFromSuperview]; + }; + if ([NSThread isMainThread]) { + removeView(); + } else { + dispatch_async(dispatch_get_main_queue(), removeView); + } + } +} + +- (UILabel *)memoryCostTip { + if (!_memoryCostTip) { + _memoryCostTip = [[UILabel alloc] initWithFrame:_memoryCostTipFrame]; + _memoryCostTip.textColor = [UIColor redColor]; + _memoryCostTip.font = [UIFont systemFontOfSize:12]; + } + return _memoryCostTip; +} + +- (void)setMemoryCostLimit:(NSUInteger)memoryCostLimit { + _memoryCostLimit = memoryCostLimit; + self.strongCache.totalCostLimit = memoryCostLimit; +} + +- (NSCache *)strongCache { + if (!_strongCache) { + _strongCache = [NSCache new]; + } + return _strongCache; +} + +@end From bd928c66252a15e84c19b08ad620e3c3f4925e16 Mon Sep 17 00:00:00 2001 From: "song.meng" Date: Sun, 5 Jul 2020 10:01:23 +0800 Subject: [PATCH 3/5] add tip --- .../UserInterfaceState.xcuserstate | Bin 49742 -> 50076 bytes Source/SVGAParser+mm.h | 2 +- Source/SVGAParser+mm.m | 2 +- Source/SVGAVideoEntity+mm.h | 2 +- Source/SVGAVideoEntity+mm.m | 2 +- 5 files changed, 4 insertions(+), 4 deletions(-) diff --git a/SVGAPlayer.xcworkspace/xcuserdata/momo.xcuserdatad/UserInterfaceState.xcuserstate b/SVGAPlayer.xcworkspace/xcuserdata/momo.xcuserdatad/UserInterfaceState.xcuserstate index 8e0a558f96a72a522a76b6c3bd0a7f4e6367b7a9..970f9f500981ad8e13166dd3afd784cec98596cf 100644 GIT binary patch delta 19384 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 delta 19505 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 diff --git a/Source/SVGAParser+mm.h b/Source/SVGAParser+mm.h index 69e2efb3..d65b2fa9 100644 --- a/Source/SVGAParser+mm.h +++ b/Source/SVGAParser+mm.h @@ -2,7 +2,7 @@ // SVGAParser+mm.h // SVGAPlayer // -// Created by MOMO on 2020/7/4. +// Created by MOMO@song.meng on 2020/7/4. // Copyright © 2020 UED Center. All rights reserved. // diff --git a/Source/SVGAParser+mm.m b/Source/SVGAParser+mm.m index 87b22162..7045d77c 100644 --- a/Source/SVGAParser+mm.m +++ b/Source/SVGAParser+mm.m @@ -2,7 +2,7 @@ // SVGAParser+mm.m // SVGAPlayer // -// Created by MOMO on 2020/7/4. +// Created by MOMO@song.meng on 2020/7/4. // Copyright © 2020 UED Center. All rights reserved. // diff --git a/Source/SVGAVideoEntity+mm.h b/Source/SVGAVideoEntity+mm.h index 5924c654..46a8a5d2 100644 --- a/Source/SVGAVideoEntity+mm.h +++ b/Source/SVGAVideoEntity+mm.h @@ -2,7 +2,7 @@ // SVGAVideoEntity+mm.h // SVGAPlayer // -// Created by MOMO on 2020/7/4. +// Created by MOMO@song.meng on 2020/7/4. // Copyright © 2020 UED Center. All rights reserved. // diff --git a/Source/SVGAVideoEntity+mm.m b/Source/SVGAVideoEntity+mm.m index 441ebda3..e24058b3 100644 --- a/Source/SVGAVideoEntity+mm.m +++ b/Source/SVGAVideoEntity+mm.m @@ -2,7 +2,7 @@ // SVGAVideoEntity+mm.m // SVGAPlayer // -// Created by MOMO on 2020/7/4. +// Created by MOMO@song.meng on 2020/7/4. // Copyright © 2020 UED Center. All rights reserved. // From f8928578a90330a4d6810d9e69d0533a61c59e58 Mon Sep 17 00:00:00 2001 From: "song.meng" Date: Sun, 5 Jul 2020 11:43:28 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E5=88=A0=E9=99=A4NSLog?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UserInterfaceState.xcuserstate | Bin 50076 -> 50613 bytes Source/SVGAVideoEntity+mm.m | 3 +-- Source/SVGAVideoMemoryCache.h | 4 +++- Source/SVGAVideoMemoryCache.m | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/SVGAPlayer.xcworkspace/xcuserdata/momo.xcuserdatad/UserInterfaceState.xcuserstate b/SVGAPlayer.xcworkspace/xcuserdata/momo.xcuserdatad/UserInterfaceState.xcuserstate index 970f9f500981ad8e13166dd3afd784cec98596cf..73b90a6fd49260410fe8de37976dab331b8db0a0 100644 GIT binary patch delta 19806 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 Md{zGJE<5M_KWVC&umAu6 delta 19400 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 diff --git a/Source/SVGAVideoEntity+mm.m b/Source/SVGAVideoEntity+mm.m index e24058b3..0899bb9c 100644 --- a/Source/SVGAVideoEntity+mm.m +++ b/Source/SVGAVideoEntity+mm.m @@ -40,7 +40,6 @@ - (NSUInteger)getMemoryCost { } [self resetMemoryCost]; - NSLog(@"======= %lu M", self.mmMemoryCost/1024/1024); return self.mmMemoryCost; } @@ -56,7 +55,7 @@ - (void)resetMemoryCost { self.mmMemoryCost += cost; } }]; - NSLog(@"------ %lu , image count:%ld", self.mmMemoryCost, self.images.count); +// NSLog(@"------ %lu , image count:%ld", self.mmMemoryCost, self.images.count); } - (NSUInteger)costForImage:(UIImage *)image { diff --git a/Source/SVGAVideoMemoryCache.h b/Source/SVGAVideoMemoryCache.h index 0d1bd17a..f9d3ba07 100644 --- a/Source/SVGAVideoMemoryCache.h +++ b/Source/SVGAVideoMemoryCache.h @@ -17,8 +17,10 @@ NS_ASSUME_NONNULL_BEGIN @interface SVGAVideoMemoryCache : NSObject -/// 是否显示内存占用tip,开启统计后才生效,默认为NO +/// 是否显示内存占用tip,开启统计后才生效,默认为NO,debug环境下默认为YES @property (nonatomic, assign) BOOL showMemoryCostTip; + +/// 设置内存占用显示位置 @property (nonatomic, assign) CGRect memoryCostTipFrame; /// 内存使用限制 diff --git a/Source/SVGAVideoMemoryCache.m b/Source/SVGAVideoMemoryCache.m index f515f3bd..383bb02d 100644 --- a/Source/SVGAVideoMemoryCache.m +++ b/Source/SVGAVideoMemoryCache.m @@ -42,7 +42,7 @@ - (instancetype)init { } - (void)cutomeInit { - _memoryCostTipFrame = CGRectMake(10, 100, 150, 15); + _memoryCostTipFrame = CGRectMake(10, [UIApplication sharedApplication].keyWindow.bounds.size.height - 75, 150, 15); _weakCache = [[NSMapTable alloc] initWithKeyOptions:NSPointerFunctionsWeakMemory valueOptions:NSPointerFunctionsStrongMemory capacity:128]; _dispatchLock = dispatch_semaphore_create(1); _memoryCacheEnable = YES; From 26be88e61931291bb8c93c98dc4baf7eb18fb4c9 Mon Sep 17 00:00:00 2001 From: "song.meng" Date: Sun, 5 Jul 2020 23:30:23 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E5=88=A0=E9=99=A4category=EF=BC=8C?= =?UTF-8?q?=E5=9C=A8=E5=8E=9F=E7=B1=BB=E4=B8=8A=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SVGAPlayer.xcodeproj/project.pbxproj | 12 --- .../UserInterfaceState.xcuserstate | Bin 50613 -> 52066 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 18 ++++ Source/SVGAParser+mm.h | 17 ---- Source/SVGAParser+mm.m | 20 ----- Source/SVGAParser.m | 7 ++ Source/SVGAVideoEntity+mm.h | 23 ----- Source/SVGAVideoEntity+mm.m | 84 ------------------ Source/SVGAVideoEntity.h | 1 + Source/SVGAVideoEntity.m | 55 +++++++++--- Source/SVGAVideoMemoryCache.h | 9 +- Source/SVGAVideoMemoryCache.m | 63 +++++++++---- 12 files changed, 122 insertions(+), 187 deletions(-) delete mode 100644 Source/SVGAParser+mm.h delete mode 100644 Source/SVGAParser+mm.m delete mode 100644 Source/SVGAVideoEntity+mm.h delete mode 100644 Source/SVGAVideoEntity+mm.m diff --git a/SVGAPlayer.xcodeproj/project.pbxproj b/SVGAPlayer.xcodeproj/project.pbxproj index 8523ff91..54fe71bc 100644 --- a/SVGAPlayer.xcodeproj/project.pbxproj +++ b/SVGAPlayer.xcodeproj/project.pbxproj @@ -59,8 +59,6 @@ 90D7CA1E1F7FB34E006E74F0 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 90D7CA1D1F7FB34E006E74F0 /* libz.tbd */; }; 90DB59B51F96026E00894727 /* SVGAImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 90DB59B41F96026E00894727 /* SVGAImageView.m */; }; FA7FA4DF24B09BE600413DF0 /* SVGAVideoMemoryCache.m in Sources */ = {isa = PBXBuildFile; fileRef = FA7FA4DE24B09BE600413DF0 /* SVGAVideoMemoryCache.m */; }; - FA7FA4E224B0B66500413DF0 /* SVGAVideoEntity+mm.m in Sources */ = {isa = PBXBuildFile; fileRef = FA7FA4E124B0B66500413DF0 /* SVGAVideoEntity+mm.m */; }; - FA7FA4E524B0C36A00413DF0 /* SVGAParser+mm.m in Sources */ = {isa = PBXBuildFile; fileRef = FA7FA4E424B0C36A00413DF0 /* SVGAParser+mm.m */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -124,10 +122,6 @@ E02B8713B25C0283C736EE03 /* Pods-SVGAPlayer.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SVGAPlayer.release.xcconfig"; path = "Pods/Target Support Files/Pods-SVGAPlayer/Pods-SVGAPlayer.release.xcconfig"; sourceTree = ""; }; FA7FA4DD24B09BE600413DF0 /* SVGAVideoMemoryCache.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SVGAVideoMemoryCache.h; sourceTree = ""; }; FA7FA4DE24B09BE600413DF0 /* SVGAVideoMemoryCache.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SVGAVideoMemoryCache.m; sourceTree = ""; }; - FA7FA4E024B0B66500413DF0 /* SVGAVideoEntity+mm.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SVGAVideoEntity+mm.h"; sourceTree = ""; }; - FA7FA4E124B0B66500413DF0 /* SVGAVideoEntity+mm.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "SVGAVideoEntity+mm.m"; sourceTree = ""; }; - FA7FA4E324B0C36A00413DF0 /* SVGAParser+mm.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SVGAParser+mm.h"; sourceTree = ""; }; - FA7FA4E424B0C36A00413DF0 /* SVGAParser+mm.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "SVGAParser+mm.m"; sourceTree = ""; }; FF89C40C3E9839DA5DE71191 /* Pods-SVGAPlayer React.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SVGAPlayer React.release.xcconfig"; path = "Pods/Target Support Files/Pods-SVGAPlayer React/Pods-SVGAPlayer React.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -244,10 +238,6 @@ 904D41F71D223DD20085A21A /* SVGABezierPath.m */, FA7FA4DD24B09BE600413DF0 /* SVGAVideoMemoryCache.h */, FA7FA4DE24B09BE600413DF0 /* SVGAVideoMemoryCache.m */, - FA7FA4E024B0B66500413DF0 /* SVGAVideoEntity+mm.h */, - FA7FA4E124B0B66500413DF0 /* SVGAVideoEntity+mm.m */, - FA7FA4E324B0C36A00413DF0 /* SVGAParser+mm.h */, - FA7FA4E424B0C36A00413DF0 /* SVGAParser+mm.m */, ); path = Source; sourceTree = ""; @@ -465,9 +455,7 @@ 90A677061D13BF77008A69F3 /* SVGAPlayer.m in Sources */, 90A364D41E5AEC1C009347F1 /* SVGAVectorLayer.m in Sources */, 90D7CA161F7FA07A006E74F0 /* Svga.pbobjc.m in Sources */, - FA7FA4E224B0B66500413DF0 /* SVGAVideoEntity+mm.m in Sources */, 90A676E21D13A6DF008A69F3 /* main.m in Sources */, - FA7FA4E524B0C36A00413DF0 /* SVGAParser+mm.m in Sources */, 90A676FD1D13A82A008A69F3 /* SVGAParser.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/SVGAPlayer.xcworkspace/xcuserdata/momo.xcuserdatad/UserInterfaceState.xcuserstate b/SVGAPlayer.xcworkspace/xcuserdata/momo.xcuserdatad/UserInterfaceState.xcuserstate index 73b90a6fd49260410fe8de37976dab331b8db0a0..b991e354bfb9b0b052a9a25a1a7575d044889156 100644 GIT binary patch delta 22809 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 + + + + + + diff --git a/Source/SVGAParser+mm.h b/Source/SVGAParser+mm.h deleted file mode 100644 index d65b2fa9..00000000 --- a/Source/SVGAParser+mm.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// SVGAParser+mm.h -// SVGAPlayer -// -// Created by MOMO@song.meng on 2020/7/4. -// Copyright © 2020 UED Center. All rights reserved. -// - -#import "SVGAParser.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface SVGAParser (mm) - -@end - -NS_ASSUME_NONNULL_END diff --git a/Source/SVGAParser+mm.m b/Source/SVGAParser+mm.m deleted file mode 100644 index 7045d77c..00000000 --- a/Source/SVGAParser+mm.m +++ /dev/null @@ -1,20 +0,0 @@ -// -// SVGAParser+mm.m -// SVGAPlayer -// -// Created by MOMO@song.meng on 2020/7/4. -// Copyright © 2020 UED Center. All rights reserved. -// - -#import "SVGAParser+mm.h" - -@implementation SVGAParser (mm) - -- (instancetype)init{ - if (self = [super init]) { - self.enabledMemoryCache = YES; - } - return self; -} - -@end diff --git a/Source/SVGAParser.m b/Source/SVGAParser.m index 0f29f04f..7c3249c4 100644 --- a/Source/SVGAParser.m +++ b/Source/SVGAParser.m @@ -31,6 +31,13 @@ + (void)load { unzipQueue.maxConcurrentOperationCount = 1; } +- (instancetype)init { + if (self = [super init]) { + _enabledMemoryCache = YES; + } + return self; +} + - (void)parseWithURL:(nonnull NSURL *)URL completionBlock:(void ( ^ _Nonnull )(SVGAVideoEntity * _Nullable videoItem))completionBlock failureBlock:(void ( ^ _Nullable)(NSError * _Nullable error))failureBlock { diff --git a/Source/SVGAVideoEntity+mm.h b/Source/SVGAVideoEntity+mm.h deleted file mode 100644 index 46a8a5d2..00000000 --- a/Source/SVGAVideoEntity+mm.h +++ /dev/null @@ -1,23 +0,0 @@ -// -// SVGAVideoEntity+mm.h -// SVGAPlayer -// -// Created by MOMO@song.meng on 2020/7/4. -// Copyright © 2020 UED Center. All rights reserved. -// - -#import "SVGAVideoEntity.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface SVGAVideoEntity (mm) - -/// 返回内存占用情况 -- (NSUInteger)getMemoryCost; - -/// 重置内存占用计算 -- (void)resetMemoryCost; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Source/SVGAVideoEntity+mm.m b/Source/SVGAVideoEntity+mm.m deleted file mode 100644 index 0899bb9c..00000000 --- a/Source/SVGAVideoEntity+mm.m +++ /dev/null @@ -1,84 +0,0 @@ -// -// SVGAVideoEntity+mm.m -// SVGAPlayer -// -// Created by MOMO@song.meng on 2020/7/4. -// Copyright © 2020 UED Center. All rights reserved. -// - -#import "SVGAVideoEntity+mm.h" -#import "SVGAVideoMemoryCache.h" -#import - -@interface SVGAVideoEntity() - -@property (nonatomic, assign) NSUInteger mmMemoryCost; - -@end - - -@implementation SVGAVideoEntity (mm) -static char mmMemoryCostKey; - -/// 方法重写 -+ (SVGAVideoEntity *)readCache:(NSString *)cacheKey { - return [[SVGAVideoMemoryCache sharedCache] objectForKey:cacheKey]; -} - -/// 方法重写 -- (void)saveCache:(NSString *)cacheKey { - [[SVGAVideoMemoryCache sharedCache] setObject:self forKey:cacheKey]; -} - - - -/// 返回内存占用情况 -- (NSUInteger)getMemoryCost { - id obj = objc_getAssociatedObject(self, &mmMemoryCostKey); - if (obj) { - return self.mmMemoryCost; - } - - [self resetMemoryCost]; - return self.mmMemoryCost; -} - -/// 重置内存占用计算 -- (void)resetMemoryCost { - if (!self.images) { - return; - } - - [self.images enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull key, UIImage * _Nonnull obj, BOOL * _Nonnull stop) { - if ([obj isKindOfClass:[UIImage class]]) { - NSUInteger cost = [self costForImage:obj]; - self.mmMemoryCost += cost; - } - }]; -// NSLog(@"------ %lu , image count:%ld", self.mmMemoryCost, self.images.count); -} - -- (NSUInteger)costForImage:(UIImage *)image { - CGImageRef imageRef = image.CGImage; - if (!imageRef) { - return 0; - } - NSUInteger bytesPerFrame = CGImageGetBytesPerRow(imageRef) * CGImageGetHeight(imageRef); - NSUInteger frameCount = image.images.count > 0 ? image.images.count : 1; - return bytesPerFrame * frameCount; -} - -- (void)setMmMemoryCost:(NSUInteger)mmMemoryCost { - objc_setAssociatedObject(self, &mmMemoryCostKey, @(mmMemoryCost), OBJC_ASSOCIATION_RETAIN); -} - -- (NSUInteger)mmMemoryCost { - id obj = objc_getAssociatedObject(self, &mmMemoryCostKey); - if ([obj respondsToSelector:@selector(unsignedIntegerValue)]) { - return [obj unsignedIntegerValue]; - } - return 0; -} - - -@end diff --git a/Source/SVGAVideoEntity.h b/Source/SVGAVideoEntity.h index 55f03046..b166eea7 100644 --- a/Source/SVGAVideoEntity.h +++ b/Source/SVGAVideoEntity.h @@ -21,6 +21,7 @@ @property (nonatomic, readonly) NSDictionary *audiosData; @property (nonatomic, readonly) NSArray *sprites; @property (nonatomic, readonly) NSArray *audios; +@property (nonatomic, readonly) NSUInteger memoryCost; - (instancetype)initWithJSONObject:(NSDictionary *)JSONObject cacheDir:(NSString *)cacheDir; - (void)resetImagesWithJSONObject:(NSDictionary *)JSONObject; diff --git a/Source/SVGAVideoEntity.m b/Source/SVGAVideoEntity.m index 8ed736f5..bf848767 100644 --- a/Source/SVGAVideoEntity.m +++ b/Source/SVGAVideoEntity.m @@ -12,6 +12,7 @@ #import "SVGAVideoSpriteEntity.h" #import "SVGAAudioEntity.h" #import "Svga.pbobjc.h" +#import "SVGAVideoMemoryCache.h" #define MP3_MAGIC_NUMBER "ID3" @@ -26,19 +27,13 @@ @interface SVGAVideoEntity () @property (nonatomic, copy) NSArray *audios; @property (nonatomic, copy) NSString *cacheDir; +@property (nonatomic, copy) NSString * cacheKey; +@property (nonatomic, readwrite) NSUInteger memoryCost; + @end @implementation SVGAVideoEntity -static NSCache *videoCache; - -+ (void)load { - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - videoCache = [[NSCache alloc] init]; - }); -} - - (instancetype)initWithJSONObject:(NSDictionary *)JSONObject cacheDir:(NSString *)cacheDir { self = [super init]; if (self) { @@ -202,12 +197,50 @@ - (void)resetAudiosWithProtoObject:(SVGAProtoMovieEntity *)protoObject { self.audios = audios; } +#pragma mark - memory + +- (void)setImages:(NSDictionary *)images { + _images = images; + + // cache存在说明以缓存,本次更新内存占用情况即可 + if (_cacheKey) { + NSUInteger formerCost = self.memoryCost; + [self resetMemoryCost]; + [[SVGAVideoMemoryCache sharedCache] updateCost:self.memoryCost - formerCost]; + } else { + [self resetMemoryCost]; + } +} + + (SVGAVideoEntity *)readCache:(NSString *)cacheKey { - return [videoCache objectForKey:cacheKey]; + return [[SVGAVideoMemoryCache sharedCache] objectForKey:cacheKey]; } - (void)saveCache:(NSString *)cacheKey { - [videoCache setObject:self forKey:cacheKey]; + _cacheKey = cacheKey; + [[SVGAVideoMemoryCache sharedCache] setObject:self forKey:cacheKey]; +} + +/// 重置内存占用计算 +- (void)resetMemoryCost { + _memoryCost = 0; + + [self.images enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull key, UIImage * _Nonnull obj, BOOL * _Nonnull stop) { + if ([obj isKindOfClass:[UIImage class]]) { + NSUInteger cost = [self costForImage:obj]; + _memoryCost += cost; + } + }]; +} + +- (NSUInteger)costForImage:(UIImage *)image { + CGImageRef imageRef = image.CGImage; + if (!imageRef) { + return 0; + } + NSUInteger bytesPerFrame = CGImageGetBytesPerRow(imageRef) * CGImageGetHeight(imageRef); + NSUInteger frameCount = image.images.count > 0 ? image.images.count : 1; + return bytesPerFrame * frameCount; } @end diff --git a/Source/SVGAVideoMemoryCache.h b/Source/SVGAVideoMemoryCache.h index f9d3ba07..28a4cb98 100644 --- a/Source/SVGAVideoMemoryCache.h +++ b/Source/SVGAVideoMemoryCache.h @@ -10,7 +10,7 @@ #import #import "SVGAVideoEntity.h" -#import "SVGAVideoEntity+mm.h" +#import "SVGAVideoEntity.h" NS_ASSUME_NONNULL_BEGIN @@ -34,6 +34,9 @@ NS_ASSUME_NONNULL_BEGIN /// 关闭后内存使用统计和内存占用提示将失效 @property (nonatomic, assign) BOOL memoryCacheEnable; +/// 退后台是否自动清理,默认为YES +@property (nonatomic, assign) BOOL clearInBackground; + + (instancetype)sharedCache; @@ -42,6 +45,10 @@ NS_ASSUME_NONNULL_BEGIN - (void)removeAllObjects; - (void)removeObjectForKey:(id)key; +/// 当图片资源被替换时更新内存占用 +/// @param cost 内存占用情况 +- (void)updateCost:(NSInteger)cost; + @end NS_ASSUME_NONNULL_END diff --git a/Source/SVGAVideoMemoryCache.m b/Source/SVGAVideoMemoryCache.m index 383bb02d..9af20ec7 100644 --- a/Source/SVGAVideoMemoryCache.m +++ b/Source/SVGAVideoMemoryCache.m @@ -8,6 +8,12 @@ // 用于处理SVGA内存缓存 // +#define safe_async_to_main(block) \ +if ([NSThread isMainThread]) { \ + block(); \ +} else { \ + dispatch_async(dispatch_get_main_queue(), block); \ +} #import "SVGAVideoMemoryCache.h" @@ -42,14 +48,16 @@ - (instancetype)init { } - (void)cutomeInit { - _memoryCostTipFrame = CGRectMake(10, [UIApplication sharedApplication].keyWindow.bounds.size.height - 75, 150, 15); - _weakCache = [[NSMapTable alloc] initWithKeyOptions:NSPointerFunctionsWeakMemory valueOptions:NSPointerFunctionsStrongMemory capacity:128]; + _weakCache = [[NSMapTable alloc] initWithKeyOptions:NSPointerFunctionsStrongMemory valueOptions:NSPointerFunctionsWeakMemory capacity:128]; _dispatchLock = dispatch_semaphore_create(1); _memoryCacheEnable = YES; + _clearInBackground = YES; #ifdef DEBUG _showMemoryCostTip = YES; #endif + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didEnterBackground) name:UIApplicationDidEnterBackgroundNotification object:nil]; } #pragma mark - public @@ -80,19 +88,37 @@ - (SVGAVideoEntity *)objectForKey:(id)key { - (void)removeAllObjects { if (_memoryCacheEnable) { [self.strongCache removeAllObjects]; - self.totalMemoryCost = 0; + + dispatch_semaphore_wait(_dispatchLock, DISPATCH_TIME_FOREVER); + NSUInteger cost = 0; + NSEnumerator *enu = self.weakCache.objectEnumerator; + SVGAVideoEntity *ent; + while ((ent = enu.nextObject)) { + cost += ent.memoryCost; + } + self.totalMemoryCost = cost; + dispatch_semaphore_signal(_dispatchLock); } } - (void)removeObjectForKey:(id)key { - SVGAVideoEntity * obj = [self objectForKey:key]; - if (obj) { - self.totalMemoryCost -= [obj getMemoryCost]; + SVGAVideoEntity * ent = [self objectForKey:key]; + if (ent) { + self.totalMemoryCost -= ent.memoryCost; } [self.strongCache removeObjectForKey:key]; } +- (void)updateCost:(NSInteger)cost { + self.totalMemoryCost += cost; +} + +- (void)didEnterBackground { + if (_clearInBackground) { + [self removeAllObjects]; + } +} #pragma mark - ptivate @@ -108,7 +134,7 @@ - (void)saveStrongCache:(SVGAVideoEntity *)object forKey:(id)key { if ([self.strongCache objectForKey:key]) { return; } - NSUInteger cost = [object getMemoryCost]; + NSUInteger cost = object.memoryCost; [self.strongCache setObject:object forKey:key cost:cost]; self.totalMemoryCost += cost; } @@ -120,7 +146,7 @@ - (void)saveStrongCache:(SVGAVideoEntity *)object forKey:(id)key { /// NSCache将要移除元素 - (void)cache:(NSCache *)cache willEvictObject:(id)obj { SVGAVideoEntity * ent = (SVGAVideoEntity *)obj; - self.totalMemoryCost -= [ent getMemoryCost]; + self.totalMemoryCost -= ent.memoryCost; } #pragma mark - setter & getter @@ -136,32 +162,31 @@ - (void)setTotalMemoryCost:(NSUInteger)totalMemoryCost { [[UIApplication sharedApplication].keyWindow addSubview:self.memoryCostTip]; } }; - if ([NSThread isMainThread]) { - showTip(); - } else { - dispatch_async(dispatch_get_main_queue(), showTip); - } + safe_async_to_main(showTip); } else if (self.memoryCostTip && self.memoryCostTip.superview) { void(^removeView)() = ^{ [self.memoryCostTip removeFromSuperview]; }; - if ([NSThread isMainThread]) { - removeView(); - } else { - dispatch_async(dispatch_get_main_queue(), removeView); - } + safe_async_to_main(removeView); } } - (UILabel *)memoryCostTip { if (!_memoryCostTip) { - _memoryCostTip = [[UILabel alloc] initWithFrame:_memoryCostTipFrame]; + _memoryCostTip = [[UILabel alloc] initWithFrame:self.memoryCostTipFrame]; _memoryCostTip.textColor = [UIColor redColor]; _memoryCostTip.font = [UIFont systemFontOfSize:12]; } return _memoryCostTip; } +- (CGRect)memoryCostTipFrame { + if (CGRectEqualToRect(_memoryCostTipFrame, CGRectZero)) { + _memoryCostTipFrame = CGRectMake(10, [UIApplication sharedApplication].keyWindow.bounds.size.height - 75, 150, 15); + } + return _memoryCostTipFrame; +} + - (void)setMemoryCostLimit:(NSUInteger)memoryCostLimit { _memoryCostLimit = memoryCostLimit; self.strongCache.totalCostLimit = memoryCostLimit;