DKWechatHelper/dkhelper/dkhelperDylib/QGVAPlayer/class/Utils/QGVAPSafeMutableDictionary.m
DKJone 888af8954e [v1.0.7](https://github.com/DKWechatHelper/DKWechatHelper/releases/tag/1.0.7) / 2021-01-29
what's new
* 动态启动图
* 动态聊天背景
* 支持8.0.1
* 更新越狱包8.0.1
* 更新已注入助手的8.0.1未签名包
* 更新越狱源安装包
2021-01-29 16:35:34 +08:00

238 lines
7.4 KiB
Objective-C

// QGVAPSafeMutableDictionary.m
// Tencent is pleased to support the open source community by making vap available.
//
// Copyright (C) 2020 THL A29 Limited, a Tencent company. All rights reserved.
//
// Licensed under the MIT License (the "License"); you may not use this file except in
// compliance with the License. You may obtain a copy of the License at
//
// http://opensource.org/licenses/MIT
//
// Unless required by applicable law or agreed to in writing, software distributed under the License is
// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
// either express or implied. See the License for the specific language governing permissions and
// limitations under the License.
#import "QGVAPSafeMutableDictionary.h"
#define VAP_INIT(...) self = super.init; \
if (!self) return nil; \
__VA_ARGS__; \
if (!_dic) return nil; \
_lock = [[NSRecursiveLock alloc] init]; \
return self;
#define VAP_LOCK(...) [_lock lock]; \
__VA_ARGS__; \
[_lock unlock];
@interface QGVAPSafeMutableDictionary(){
NSMutableDictionary *_dic;
NSRecursiveLock *_lock;
}
@end
@implementation QGVAPSafeMutableDictionary
#pragma mark - init
- (instancetype)init {
VAP_INIT(_dic = [[NSMutableDictionary alloc] init]);
}
- (instancetype)initWithObjects:(NSArray *)objects forKeys:(NSArray *)keys {
VAP_INIT(_dic = [[NSMutableDictionary alloc] initWithObjects:objects forKeys:keys]);
}
- (instancetype)initWithCapacity:(NSUInteger)capacity {
VAP_INIT(_dic = [[NSMutableDictionary alloc] initWithCapacity:capacity]);
}
- (instancetype)initWithObjects:(const id[])objects forKeys:(const id <NSCopying>[])keys count:(NSUInteger)cnt {
VAP_INIT(_dic = [[NSMutableDictionary alloc] initWithObjects:objects forKeys:keys count:cnt]);
}
- (instancetype)initWithDictionary:(NSDictionary *)otherDictionary {
VAP_INIT(_dic = [[NSMutableDictionary alloc] initWithDictionary:otherDictionary]);
}
- (instancetype)initWithDictionary:(NSDictionary *)otherDictionary copyItems:(BOOL)flag {
VAP_INIT(_dic = [[NSMutableDictionary alloc] initWithDictionary:otherDictionary copyItems:flag]);
}
#pragma mark - method
- (NSUInteger)count {
VAP_LOCK(NSUInteger c = _dic.count); return c;
}
- (id)objectForKey:(id)aKey {
VAP_LOCK(id o = [_dic objectForKey:aKey]); return o;
}
- (NSEnumerator *)keyEnumerator {
VAP_LOCK(NSEnumerator * e = [_dic keyEnumerator]); return e;
}
- (NSArray *)allKeys {
VAP_LOCK(NSArray * a = [_dic allKeys]); return a;
}
- (NSArray *)allKeysForObject:(id)anObject {
VAP_LOCK(NSArray * a = [_dic allKeysForObject:anObject]); return a;
}
- (NSArray *)allValues {
VAP_LOCK(NSArray * a = [_dic allValues]); return a;
}
- (NSString *)description {
VAP_LOCK(NSString * d = [_dic description]); return d;
}
- (NSString *)descriptionInStringsFileFormat {
VAP_LOCK(NSString * d = [_dic descriptionInStringsFileFormat]); return d;
}
- (NSString *)descriptionWithLocale:(id)locale {
VAP_LOCK(NSString * d = [_dic descriptionWithLocale:locale]); return d;
}
- (NSString *)descriptionWithLocale:(id)locale indent:(NSUInteger)level {
VAP_LOCK(NSString * d = [_dic descriptionWithLocale:locale indent:level]); return d;
}
- (BOOL)isEqualToDictionary:(NSDictionary *)otherDictionary {
if (otherDictionary == self) return YES;
if ([otherDictionary isKindOfClass:QGVAPSafeMutableDictionary.class]) {
QGVAPSafeMutableDictionary *other = (id)otherDictionary;
BOOL isEqual;
[_lock lock];
[other->_lock lock];
isEqual = [_dic isEqual:other->_dic];
[other->_lock unlock];
[_lock unlock];
return isEqual;
}
return NO;
}
- (NSEnumerator *)objectEnumerator {
VAP_LOCK(NSEnumerator * e = [_dic objectEnumerator]); return e;
}
- (NSArray *)objectsForKeys:(NSArray *)keys notFoundMarker:(id)marker {
VAP_LOCK(NSArray * a = [_dic objectsForKeys:keys notFoundMarker:marker]); return a;
}
- (NSArray *)keysSortedByValueUsingSelector:(SEL)comparator {
VAP_LOCK(NSArray * a = [_dic keysSortedByValueUsingSelector:comparator]); return a;
}
- (void)getObjects:(id __unsafe_unretained[])objects andKeys:(id __unsafe_unretained[])keys {
VAP_LOCK([_dic getObjects:objects andKeys:keys]);
}
- (id)objectForKeyedSubscript:(id)key {
VAP_LOCK(id o = [_dic objectForKeyedSubscript:key]); return o;
}
- (void)enumerateKeysAndObjectsUsingBlock:(__attribute__((noescape)) void (^)(id key, id obj, BOOL *stop))block {
VAP_LOCK([_dic enumerateKeysAndObjectsUsingBlock:block]);
}
- (void)enumerateKeysAndObjectsWithOptions:(NSEnumerationOptions)opts usingBlock:(__attribute__((noescape)) void (^)(id key, id obj, BOOL *stop))block {
VAP_LOCK([_dic enumerateKeysAndObjectsWithOptions:opts usingBlock:block]);
}
- (NSArray *)keysSortedByValueUsingComparator:(__attribute__((noescape)) NSComparator)cmptr {
VAP_LOCK(NSArray * a = [_dic keysSortedByValueUsingComparator:cmptr]); return a;
}
- (NSArray *)keysSortedByValueWithOptions:(NSSortOptions)opts usingComparator:(__attribute__((noescape)) NSComparator)cmptr {
VAP_LOCK(NSArray * a = [_dic keysSortedByValueWithOptions:opts usingComparator:cmptr]); return a;
}
- (NSSet *)keysOfEntriesPassingTest:(__attribute__((noescape)) BOOL (^)(id key, id obj, BOOL *stop))predicate {
VAP_LOCK(NSSet * a = [_dic keysOfEntriesPassingTest:predicate]); return a;
}
- (NSSet *)keysOfEntriesWithOptions:(NSEnumerationOptions)opts passingTest:(__attribute__((noescape)) BOOL (^)(id key, id obj, BOOL *stop))predicate {
VAP_LOCK(NSSet * a = [_dic keysOfEntriesWithOptions:opts passingTest:predicate]); return a;
}
#pragma mark - mutable
- (void)removeObjectForKey:(id)aKey {
VAP_LOCK([_dic removeObjectForKey:aKey]);
}
- (void)setObject:(id)anObject forKey:(id <NSCopying> )aKey {
VAP_LOCK([_dic setObject:anObject forKey:aKey]);
}
- (void)addEntriesFromDictionary:(NSDictionary *)otherDictionary {
VAP_LOCK([_dic addEntriesFromDictionary:otherDictionary]);
}
- (void)removeAllObjects {
VAP_LOCK([_dic removeAllObjects]);
}
- (void)removeObjectsForKeys:(NSArray *)keyArray {
VAP_LOCK([_dic removeObjectsForKeys:keyArray]);
}
- (void)setDictionary:(NSDictionary *)otherDictionary {
VAP_LOCK([_dic setDictionary:otherDictionary]);
}
- (void)setObject:(id)obj forKeyedSubscript:(id <NSCopying> )key {
VAP_LOCK([_dic setObject:obj forKeyedSubscript:key]);
}
#pragma mark - protocol
- (id)copyWithZone:(NSZone *)zone {
return [self mutableCopyWithZone:zone];
}
- (id)mutableCopyWithZone:(NSZone *)zone {
VAP_LOCK(id copiedDictionary = [[self.class allocWithZone:zone] initWithDictionary:_dic]);
return copiedDictionary;
}
- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state
objects:(id __unsafe_unretained[])stackbuf
count:(NSUInteger)len {
VAP_LOCK(NSUInteger count = [_dic countByEnumeratingWithState:state objects:stackbuf count:len]);
return count;
}
- (BOOL)isEqual:(id)object {
if (object == self) return YES;
if ([object isKindOfClass:QGVAPSafeMutableDictionary.class]) {
QGVAPSafeMutableDictionary *other = object;
BOOL isEqual;
[_lock lock];
[other->_lock lock];
isEqual = [_dic isEqual:other->_dic];
[other->_lock unlock];
[_lock unlock];
return isEqual;
}
return NO;
}
- (NSUInteger)hash {
VAP_LOCK(NSUInteger hash = [_dic hash]);
return hash;
}
@end