Repository: incubator-weex Updated Branches: refs/heads/master 477e9a8ab -> 0e74f4f94
* [iOS] override allKeys and allValues method for safeDictionary Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/0e74f4f9 Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/0e74f4f9 Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/0e74f4f9 Branch: refs/heads/master Commit: 0e74f4f94bb5d253342a02af4892eaf58258edc6 Parents: 477e9a8 Author: acton393 <zhangxing610...@gmail.com> Authored: Mon Feb 26 15:43:34 2018 +0800 Committer: acton393 <zhangxing610...@gmail.com> Committed: Mon Feb 26 15:43:34 2018 +0800 ---------------------------------------------------------------------- .../Utility/WXThreadSafeMutableDictionary.m | 42 ++++++++++++++++++++ 1 file changed, 42 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/0e74f4f9/ios/sdk/WeexSDK/Sources/Utility/WXThreadSafeMutableDictionary.m ---------------------------------------------------------------------- diff --git a/ios/sdk/WeexSDK/Sources/Utility/WXThreadSafeMutableDictionary.m b/ios/sdk/WeexSDK/Sources/Utility/WXThreadSafeMutableDictionary.m index 21da6a0..ae04bb0 100644 --- a/ios/sdk/WeexSDK/Sources/Utility/WXThreadSafeMutableDictionary.m +++ b/ios/sdk/WeexSDK/Sources/Utility/WXThreadSafeMutableDictionary.m @@ -34,6 +34,34 @@ @end +#define OVERRIDE_METHOD(method,retValue) \ +do { \ + _Pragma("clang diagnostic push") \ + _Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"") \ + if (![WXUtility threadSafeCollectionUsingLock]) {\ + dispatch_sync(_queue, ^{\ + if ([_dict respondsToSelector:method]) {\ + retValue = [_dict performSelector:method];\ + }\ + });\ + } else {\ + if (WX_SYS_VERSION_GREATER_THAN(@"10.0")) {\ + os_unfair_lock_lock(&_unfairLock);\ + if ([_dict respondsToSelector:method]) {\ + retValue = [_dict performSelector:method];\ + }\ + os_unfair_lock_unlock(&_unfairLock);\ + } else {\ + pthread_mutex_lock(&_safeThreadDictionaryMutex);\ + if ([_dict respondsToSelector:method]) {\ + retValue = [_dict performSelector:method];\ + }\ + pthread_mutex_unlock(&_safeThreadDictionaryMutex);\ + }\ + }\ + _Pragma("clang diagnostic pop")\ +} while (0) + @implementation WXThreadSafeMutableDictionary - (instancetype)initCommon @@ -187,6 +215,20 @@ } } +- (NSArray *)allKeys +{ + __block NSArray *allKeys = nil; + OVERRIDE_METHOD(_cmd, allKeys); + return allKeys; +} + +- (NSArray *)allValues +{ + __block NSArray *allValues = nil; + OVERRIDE_METHOD(_cmd, allValues); + return allValues; +} + - (void)removeObjectForKey:(id)aKey { if (![WXUtility threadSafeCollectionUsingLock]) {