利用ARC解决遗忘unlock的毛病
来源:互联网 发布:中国金融街证券大数据 编辑:程序博客网 时间:2024/05/16 13:01
文章转载自老谭笔记:http://www.tanhao.me/pieces/1765.html/
我们在使用lock的时候会有这样的情况:因为某方法内部逻辑较为复杂,会有很多地方return,稍不留神都会漏掉一次unlock的操作,在查看一些C++源码时发现一种比较优雅的设计,在某个方法或一个代码块需要锁时,不直接对锁进行操作,而是通过创建一个局部对象来管理这个锁,我们将这个对象称之为”哨兵”,该对象在构造函数中执行lock操作,而在析构函数中执行unlock,这样当我们需要加锁时只需要创建这个对象,当函数return后或代码块结束时,因为局部对象在超出作用域后释放,便自动完成了unlock的动作。
而在Objective-C中我们不能创建局部对象,但利用ARC的特性却也可以达到超出作用域自动释放的特性。
以下是”哨兵”类的实现:
@interface QMGuard : NSObject{ id<NSLocking> lock;}@end@implementation QMGuard- (id)initWithLock:(id<NSLocking>)obj{ self = [super init]; if (self) { lock = obj; [lock lock]; } return self;}- (void)dealloc{ [lock unlock];}@end
以下是我们在使用锁的时候:
//为了方便使用#define QUARD(lock) \QMGuard *_guard_ = [[QMGuard alloc] initWithLock:lock];\NSAssert(_guard_, @"_guard_ invaild");@interface MyClass : NSObject{ NSLock *lock;}@end@implementation MyClass- (id)init{ self = [super init]; if (self) { lock = [[NSLock alloc] init]; } return self;}- (void)test1{ QUARD(lock) NSLog(@"do test1");}- (void)test2{ QUARD(lock) NSLog(@"do test2");}@end
0 0
- 利用ARC解决遗忘unlock的毛病
- 利用ARC解决遗忘unlock的毛病
- 利用sniffer获取遗忘的sa登陆密码
- ATI X550系列显卡的毛病的解决
- 全面解决内存writen或read的毛病
- oracle的毛病!!
- 改改你的毛病
- 程序员的臭毛病
- 程序员的臭毛病
- 程序毛病的代价
- 很多开发人员的毛病
- 很多开发人员的毛病
- 程序员的臭毛病
- 主板一长声两短声是哪的毛病?
- 很多开发人员的毛病
- fckeditor 的毛病
- fckeditor 的毛病续
- 笑话:程序员的毛病
- 地图坐标查询
- Ruby:String转Time
- Codeforces 527D. Clique Problem 贪心
- Pre-compile (pre-JIT) your assembly on the fly, or trigger JIT compilation ahead-of-time
- mysql优化总结(五)
- 利用ARC解决遗忘unlock的毛病
- Hive安装
- 图像特征提取(颜色,纹理,形状)
- 在什么情况下使用单件模式比全局变量好
- Android最佳实践之响应灵敏性
- 如何修改android工程的包名
- 创建Maven web项目
- kakfa源码环境搭建
- maven in action(三)hello world maven