一:GCD
1、正常调用方法和performSelector异同:
以下两种方法是等效的
[object performSelector:@selector(selectorName) ];
[object selectorName];
有时使用performSelector会更加方便、灵活些,能动态调用
SEL selector;
if(condition){
selector=@selector(foo);
}else if(condition){
selector=@selector(bar);
}else{
selector=@selector(baz);
}
id ret= [object performSelector:select];
以上的代码
1)在ARC下会产生内存泄露。performSelector系列方法无法确定将要执行的选择子具体是什么,因而ARC编译器也就无法插入适当的内存管理方法。
2)performSelector返回值只能是void和id类型,如果返回的是基本数据类型则会产生繁琐的转换。
3)使用-(id)performSelector:(SEL)Selector withObject:(id)arument afterDelay:(NSTimeInterval)delay;等类performSelector系列方法
发现传递多个参数不太方便
发现在使用performSelector系列方法时会产生局限性或者一些bug,应慎用performSelector系列的方法
2、可以通过使用以下的方法替代以上的-(id)performSelector:(SEL)Selector withObject:(id)arument afterDelay:(NSTimeInterval)delay;----延迟一定时间再执行某方法
dispatch_time_t time=dispatch_time(DISPATCH_TIME_NOW,(int64_t)(5.0*NSEC_PER_SEC));
dispatch_after(time,dispatch_get_main_queue(),^(void){
[self doSomething];
});
//把主任务放在主线程上执行
dispatch_async(dispatch_get_main_queue(),^{
[self doSomething];
});
参考:Effective Objective-C 2.0 编写高质量iOS与OS X代码的52个有效方法
二:数据读取与写入、同步锁安全机制
1、多个获取数据方法并发执行,获取方法与设置方法之间不能并发执行,通过使用栅栏(barrier)向队列中派发快,轻易实现数据读取写入安全机制
栅栏使用GCD方法:
void dispatch_barrier_async(dispatch_queue_t queue,dispatch_block block);
void dispatch_barrier_sync(dispatch_queue_t queue,dispatch_block_t block);
//数据读取写入代码:
_syncQueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
- (NSString*)someString{
__block NSString *localSomeString;
dispatch_sync(_syncQueue,^{
localSOmeString=_someString;
});
return LocalSomeString;
}
-(void)setSomeString:(NSString *)someString{
dispatch_barrier_async(_syncQueue,^{
_someString=someString;
});
}