GCD,线程使用的一些笔记

一: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;

});

}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值