0.0.1, dealloc block, 讲好一个故事,iOS 面试题

本文探讨如何在iOS中使用block替代dealloc方法,利用关联对象原理,以及引入锁的概念。文章通过分析一个库的实现,讲解了在对象释放时执行特定操作的方法,包括优化过的 dealloc block 执行器的实现,以及锁在并发控制中的应用,如自旋锁、互斥锁和信号量。此外,还讨论了关联对象的内部原理和锁的使用策略。
摘要由CSDN通过智能技术生成

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值