博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一种Auto Unlock的方法
阅读量:6720 次
发布时间:2019-06-25

本文共 2168 字,大约阅读时间需要 7 分钟。

有讲如何使用cleanup来简化使用lock代码。

__attribute__这个修饰符很有用,前段时间集中写了一些东西收集这些有意思__attribute__。戳

今天展示一种另外的方法达到这个目的。最终代码放在了我的

实现

#define CONCAT(x, y) x##y#define MACRO_CONCAT(x,y) CONCAT(x,y)@interface AutoUnlockObject : NSObject {    id
_lock;}- (id) initWithLock:(id
)theLock;@end@implementation AutoUnlockObject- (id) initWithLock:(id
)theLock{ self = [super init]; _lock = theLock; [_lock lock]; return self;}- (void) dealloc{ [_lock unlock];}@end#define AUTOLOCK(lock) \__unused AutoUnlockObject* MACRO_CONCAT(tmpObject,__COUNTER__) = [[AutoUnlockObject alloc] initWithLock:lock];

解释

利用ARC的特性,在离开代码块时,tmpObject会自动释放。这样-dealloc中的unlock回触发,从而实现自动unlock。

- (void) dosth{    AUTOLOCK(self.lock);    //do actual work you want below}

__Counter__是一个gcc提供的宏,在此用于产生一个文件内唯一的数字,这样就可以在同一个函数里多次使用AUTOLOCKlock不同的锁。 CONCATMACRO_CONCAT是一种惯用的连接Macro的手法,不多说了。

这种方法依赖于代码块的长度,如果要分段使用多次lock同一把锁。那就方法如下:

- (void) dosth{    {        AUTOLOCK(self.lock);        //do actual work you want below    }        {        AUTOLOCK(self.lock);        //do actual work you want below    }}

如果还嫌麻烦,那就只能用这个函数:

void lockAndDo(id
lock,dispatch_block_t block){ if (lock) { AUTOLOCK(lock); if (block) { block(); } }else{ if (block) { block(); } }}

使用时:

lockAndDo(lock, ^{     //do actual work you want here   });

这样以来就跟@synchronized很像了。

增强

@interface AutoUnlockObject2 : AutoUnlockObject @property (nonatomic,copy) dispatch_block_t block;@end@implementation AutoUnlockObject2- (void) dealloc{    if (self.block) self.block();    [_lock unlock];}@end#define AUTOLOCK2(lock) \__unused  AutoUnlockObject2* tmpObject = [[AutoUnlockObject2 alloc] initWithLock:lock];\tmpObject.block = ^

增强一下,使用起来跟@synchronizedcleanup的方案基本差不太多了:

AUTOLOCK2(lock){    NSLog(@"hi");};

美中不足:没有使用__COUNTER__,如果不分代码块的话,一个作用域里只能用一个。

更新一下,改成这种就好了,

#define AUTOLOCK3(lock) \[[AutoUnlockObject2 alloc] initWithLock:lock].block = ^//usageAUTOLOCK3(lock){    NSLog(@"hi1");};AUTOLOCK3(lock){    NSLog(@"hi2");};

恩.

All is well that ends well

总结

不过话说回来,现在用lock的时候,已经不太多了。C++的代码基本也可以用类似实现。

原作写于segmentfault

转载地址:http://lijmo.baihongyu.com/

你可能感兴趣的文章
Windows下安装cacti
查看>>
静态路由实验
查看>>
PSR-0规范
查看>>
windows系统中查看linux分区的三种方式
查看>>
Linux下安装DBD::Oracle、DBI和Ora2Pg
查看>>
一次性统计SQL Server中全部表的数量和行的数量
查看>>
四肢瘫痪者植入芯片后首次自己吃饭
查看>>
JAVA集合
查看>>
akka进阶(1) - supervisor strategy
查看>>
Linux基础之until语法
查看>>
SCCM2012SP1---部署Windows8操作系统
查看>>
java 小问题
查看>>
线程 GCD (第二种)
查看>>
linux解压rar文件
查看>>
js+css3 轮播
查看>>
delphi - 为 Frame 添加 OnShow 事件响应函数.
查看>>
Linux系统守护进程详解
查看>>
如何判断linux服务器是否需要添加内存
查看>>
软路由ros(MIKROTIK)安装教程:[11]端口映射
查看>>
【推荐】捕获WCF服务端与客户端产生的通讯数据并分析
查看>>