1, 开篇
本文试图回答,如下问题:
1, 对象 dealloc 的时候,用一个 block 代替 dealloc 方法
不是类级别控制,是对象级别控制
2,关联对象
3,锁
本文是面试照着念主题,第 2 篇
本文有参考 C…/CYLDeallocBlockExecutor
1, 怎样用好 block,让 dealloc 再见
因为对象释放的时候,对象的关联对象也会释放。
把对象释放的时候,要执行的 block ,放在其关联对象的 dealloc 方法中。
附加:
typedef void (^VoidBlock)(void);
@interface BlockExecutor : NSObject {
VoidBlock block;
}
@property (nonatomic, readwrite, copy) VoidBlock block;
- (id)initWithBlock:(VoidBlock)block;
@end
@implementation BlockExecutor
@synthesize block;
- (id)initWithBlock:(VoidBlock)aBlock
{
self = [super init];
if (self) {
block = [aBlock copy];
}
return self;
}
- (void)dealloc
{
if (block != nil) {
block();
block = nil;
}
}
@end
const void *runAtDeallocBlockKey = &runAtDeallocBlockKey;
@interface NSObject (RunAtDealloc)
- (void)runAtDealloc:(VoidBlock)block;
@end
@implementation NSObject (RunAtDealloc)
- (void)runAtDealloc:(VoidBlock)block
{
if (block) {
BlockExecutor *executor = [[BlockExecutor alloc] initWithBlock:block];
objc_setAssociatedObject(self,
runAtDeallocBlockKey,
executor,
OBJC_ASSOCIATION_RETAIN);
}
}
@end
调用
- (void)viewDidLoad {
[super viewDidLoad];
NSObject * pikachu = [[NSObject alloc] init];
[pikachu runAtDealloc:^{
NSLog(@"Deallocating pikachu!");
}];
}
详细三步走:
1, 一个有 block 的关联类,他的 dealloc 方法中,执行 block
2,给 NSObject 添加分类方法,传递 block ,方便调用。
把关联类,关联上观察类。
3,观察类调用,传入 block
优化:CYLDeallocBlockExecutor
的实现
CYLDeallocBlockExecutor