YYThreadSafeArray和YYThreadSafeDictionary的学习

图片来之网络

NSArray和NSDictionary是非线程安全的,所以YY添加了YYThreadSageArray和YYThreadSafeDictionary来添加一个锁,保证线程安全。

实现

采用了两个宏来添加信号量并发控制:
初始化和信号量创建宏:

#define INIT(...) self = super.init; \
if (!self) return nil; \
__VA_ARGS__; \
if (!_arr) return nil; \
_lock = dispatch_semaphore_create(1); \
return self;

添加信号量等待和信号量发送宏:

#define LOCK(...) dispatch_semaphore_wait(_lock, DISPATCH_TIME_FOREVER); \
__VA_ARGS__; \
dispatch_semaphore_signal(_lock);

一共使用的函数有:

  • dispatch_semaphore_create
  • dispatch_semaphore_wait
  • dispatch_semaphore_signal
    使用效果的解析在 YYWeaKProxy的学习中有说明。

NSArray及NSMutableArray需要重载保证线程安全的方法

初始化方法

  • - (instancetype)init
  • - (instancetype)initWithCapacity:(NSUInteger)numItems
  • - (instancetype)initWithArray:(NSArray *)array
  • - (instancetype)initWithObjects:(const id[])objects count:(NSUInteger)cnt
  • - (instancetype)initWithContentsOfFile:(NSString *)path
  • - (instancetype)initWithContentsOfURL:(NSURL *)url

实例方法

  • - (NSUInteger)count
  • - (id)objectAtIndex:(NSUInteger)index
  • - (NSArray *)arrayByAddingObject:(id)anObject
  • - (NSArray *)arrayByAddingObjectsFromArray:(NSArray *)otherArray
  • - (NSString *)componentsJoinedByString:(NSString *)separator
  • - (BOOL)containsObject:(id)anObject
  • - (NSString *)description
  • - (NSString *)descriptionWithLocale:(id)locale
  • - (NSString *)descriptionWithLocale:(id)locale indent:(NSUInteger)level
  • - (id)firstObjectCommonWithArray:(NSArray *)otherArray
  • - (void)getObjects:(id __unsafe_unretained[])objects range:(NSRange)range
  • - (NSUInteger)indexOfObject:(id)anObject
  • - (NSUInteger)indexOfObject:(id)anObject inRange:(NSRange)range
  • - (NSUInteger)indexOfObjectIdenticalTo:(id)anObject
  • - (NSUInteger)indexOfObjectIdenticalTo:(id)anObject inRange:(NSRange)range
  • - (id)firstObject
  • - (id)lastObject
  • - (NSEnumerator *)objectEnumerator
  • - (NSEnumerator *)reverseObjectEnumerator
  • - (NSData *)sortedArrayHint
  • - (NSArray *)sortedArrayUsingFunction:(NSInteger (*)(id, id, void *))comparator context:(void *)context
  • - (NSArray *)sortedArrayUsingFunction:(NSInteger (*)(id, id, void *))comparator context:(void *)context hint:(NSData *)hint
  • - (NSArray *)sortedArrayUsingSelector:(SEL)comparator
  • - (NSArray *)subarrayWithRange:(NSRange)range
  • - (void)makeObjectsPerformSelector:(SEL)aSelector
  • - (void)makeObjectsPerformSelector:(SEL)aSelector withObject:(id)argument
  • - (NSArray *)objectsAtIndexes:(NSIndexSet *)indexes
  • - (id)objectAtIndexedSubscript:(NSUInteger)idx
  • - (void)enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))block
  • - (void)enumerateObjectsWithOptions:(NSEnumerationOptions)opts usingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))block
  • - (void)enumerateObjectsAtIndexes:(NSIndexSet *)s options:(NSEnumerationOptions)opts usingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))block
  • - (NSUInteger)indexOfObjectPassingTest:(BOOL (^)(id obj, NSUInteger idx, BOOL *stop))predicate
  • - (NSUInteger)indexOfObjectWithOptions:(NSEnumerationOptions)opts passingTest:(BOOL (^)(id obj, NSUInteger idx, BOOL *stop))predicate
  • - (NSUInteger)indexOfObjectAtIndexes:(NSIndexSet *)s options:(NSEnumerationOptions)opts passingTest:(BOOL (^)(id obj, NSUInteger idx, BOOL *stop))predicate
  • - (NSIndexSet *)indexesOfObjectsPassingTest:(BOOL (^)(id obj, NSUInteger idx, BOOL *stop))predicate
  • - (NSIndexSet *)indexesOfObjectsWithOptions:(NSEnumerationOptions)opts passingTest:(BOOL (^)(id obj, NSUInteger idx, BOOL *stop))predicate
  • - (NSIndexSet *)indexesOfObjectsAtIndexes:(NSIndexSet *)s options:(NSEnumerationOptions)opts passingTest:(BOOL (^)(id obj, NSUInteger idx, BOOL *stop))predicate
  • - (NSArray *)sortedArrayUsingComparator:(NSComparator)cmptr
  • - (NSArray *)sortedArrayWithOptions:(NSSortOptions)opts usingComparator:(NSComparator)cmptr
  • - (NSUInteger)indexOfObject:(id)obj inSortedRange:(NSRange)r options:(NSBinarySearchingOptions)opts usingComparator:(NSComparator)cmp

可变数组的实例方法

  • - (void)addObject:(id)anObject
  • - (void)insertObject:(id)anObject atIndex:(NSUInteger)index
  • - (void)removeLastObject
  • - (void)removeObjectAtIndex:(NSUInteger)index
  • - (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject
  • - (void)addObjectsFromArray:(NSArray *)otherArray
  • - (void)exchangeObjectAtIndex:(NSUInteger)idx1 withObjectAtIndex:(NSUInteger)idx2
  • - (void)removeAllObjects
  • - (void)removeObject:(id)anObject inRange:(NSRange)range
  • - (void)removeObject:(id)anObject
  • - (void)removeObjectIdenticalTo:(id)anObject inRange:(NSRange)range
  • - (void)removeObjectIdenticalTo:(id)anObject
  • - (void)removeObjectsInArray:(NSArray *)otherArray
  • - (void)removeObjectsInRange:(NSRange)range
  • - (void)replaceObjectsInRange:(NSRange)range withObjectsFromArray:(NSArray *)otherArray range:(NSRange)otherRange
  • - (void)replaceObjectsInRange:(NSRange)range withObjectsFromArray:(NSArray *)otherArray
  • - (void)setArray:(NSArray *)otherArray
  • - (void)sortUsingFunction:(NSInteger (*)(id, id, void *))compare context:(void *)context
  • - (void)sortUsingSelector:(SEL)comparator
  • - (void)insertObjects:(NSArray *)objects atIndexes:(NSIndexSet *)indexes
  • - (void)removeObjectsAtIndexes:(NSIndexSet *)indexes
  • - (void)replaceObjectsAtIndexes:(NSIndexSet *)indexes withObjects:(NSArray *)objects
  • - (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)idx
  • - (void)sortUsingComparator:(NSComparator)cmptr
  • - (void)sortWithOptions:(NSSortOptions)opts usingComparator:(NSComparator)cmptr
  • - (BOOL)isEqualToArray:(NSArray *)otherArray

协议方法

  • - (id)copyWithZone:(NSZone *)zone
  • - (id)mutableCopyWithZone:(NSZone *)zone
  • - (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id __unsafe_unretained[])stackbuf count:(NSUInteger)len
  • - (BOOL)isEqual:(id)object
  • - (NSUInteger)hash

NSDictionary及NSMutableDictionary需要重载保证线程安全的方法

初始化方法

  • - (instancetype)init
  • - (instancetype)initWithObjects:(NSArray *)objects forKeys:(NSArray *)keys
  • - (instancetype)initWithCapacity:(NSUInteger)capacity
  • - (instancetype)initWithObjects:(const id[])objects forKeys:(const id <NSCopying>[])keys count:(NSUInteger)cnt
  • - (instancetype)initWithDictionary:(NSDictionary *)otherDictionary
  • - (instancetype)initWithDictionary:(NSDictionary *)otherDictionary copyItems:(BOOL)flag

实例方法

  • - (NSUInteger)count
  • - (id)objectForKey:(id)aKey
  • - (NSEnumerator *)keyEnumerator
  • - (NSArray *)allKeys
  • - (NSArray *)allKeysForObject:(id)anObject
  • - (NSArray *)allValues
  • - (NSString *)description
  • - (NSString *)descriptionInStringsFileFormat
  • - (NSString *)descriptionWithLocale:(id)locale
  • - (NSString *)descriptionWithLocale:(id)locale indent:(NSUInteger)level
  • - (BOOL)isEqualToDictionary:(NSDictionary *)otherDictionary
  • - (NSEnumerator *)objectEnumerator
  • - (NSArray *)objectsForKeys:(NSArray *)keys notFoundMarker:(id)marker
  • - (NSArray *)keysSortedByValueUsingSelector:(SEL)comparator
  • - (void)getObjects:(id __unsafe_unretained[])objects andKeys:(id __unsafe_unretained[])keys
  • - (id)objectForKeyedSubscript:(id)key
  • - (void)enumerateKeysAndObjectsUsingBlock:(void (^)(id key, id obj, BOOL *stop))block
  • - (void)enumerateKeysAndObjectsWithOptions:(NSEnumerationOptions)opts usingBlock:(void (^)(id key, id obj, BOOL *stop))block
  • - (NSArray *)keysSortedByValueUsingComparator:(NSComparator)cmptr
  • - (NSArray *)keysSortedByValueWithOptions:(NSSortOptions)opts usingComparator:(NSComparator)cmptr
  • - (NSSet *)keysOfEntriesPassingTest:(BOOL (^)(id key, id obj, BOOL *stop))predicate
  • - (NSSet *)keysOfEntriesWithOptions:(NSEnumerationOptions)opts passingTest:(BOOL (^)(id key, id obj, BOOL *stop))predicate

可变字典

  • - (void)removeObjectForKey:(id)aKey
  • - (void)setObject:(id)anObject forKey:(id <NSCopying> )aKey
  • - (void)addEntriesFromDictionary:(NSDictionary *)otherDictionary
  • - (void)removeAllObjects
  • - (void)removeObjectsForKeys:(NSArray *)keyArray
  • - (void)setDictionary:(NSDictionary *)otherDictionary
  • - (void)setObject:(id)obj forKeyedSubscript:(id <NSCopying> )key

协议方法

  • - (id)copyWithZone:(NSZone *)zone
  • - (id)mutableCopyWithZone:(NSZone *)zone
  • - (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id __unsafe_unretained[])stackbuf count:(NSUInteger)len
  • - (BOOL)isEqual:(id)object
  • - (NSUInteger)hash

收获

了解到了NSArray和NSDictionary很多一直没有用到过的方法。学习到了NSIndexSet的用法,之前从来不会用到这个方法。都是自己编写逻辑写一遍。

// END

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容