Objective c 如何在一个对象解除锁定时运行一些代码

Objective c 如何在一个对象解除锁定时运行一些代码,objective-c,cocoa-touch,Objective C,Cocoa Touch,当一个对象获得dealloc时,需要运行一些代码。例如,我设置了一个观察者,当对象B的名称更改时,它会更新标签A的文本。当标签A的保留计数达到0时,我想从B中删除观察者 可能的解决办法: 1子类并调用dealloc中的干净代码 2创建一个包装器类,该类能够在dealloc中运行任意代码,并将此对象与标签a关联。当一个get dealloc时,关联的对象get dealloc也会被关联。假设只有a持有对它的强引用,则会调用该代码 我不喜欢第一个,因为它是如此侵入,使它几乎没有用处,需要子类只是为了

当一个对象获得dealloc时,需要运行一些代码。例如,我设置了一个观察者,当对象B的名称更改时,它会更新标签A的文本。当标签A的保留计数达到0时,我想从B中删除观察者

可能的解决办法: 1子类并调用dealloc中的干净代码

2创建一个包装器类,该类能够在dealloc中运行任意代码,并将此对象与标签a关联。当一个get dealloc时,关联的对象get dealloc也会被关联。假设只有a持有对它的强引用,则会调用该代码

我不喜欢第一个,因为它是如此侵入,使它几乎没有用处,需要子类只是为了一些简单的东西。所以我用的是2号


你有什么意见吗?你是怎么做到的?

我把我的解决方案放在这里,以防有人需要

@interface ExecuteWrapper : NSObject

@property (nonatomic, copy) void(^block)();

-(void)dealloc;
@end

@implementation ExecuteWrapper
-(void)dealloc{
    if(self.block){
        self.block();
    }
}
@end

@implementation NSObject (SLUtil)

+(void)executeWhenDealloc:(NSObject *)object block:(void(^)())block{
    static char key;
    NSMutableArray *executeWrapperArray = [object associatedValueForKey:&key];
    if ( executeWrapperArray == nil){
        executeWrapperArray = [NSMutableArray array];
        [object associateValue:executeWrapperArray withKey:&key];
    }
    ExecuteWrapper *executeWrapper = [[ExecuteWrapper alloc] init];
    executeWrapper.block = block;
    [executeWrapperArray addObject:executeWrapper];
}
@end
在客户端代码中

[NSObject executeWhenDealloc:labelA block:^{
    // clean up code
}];

注意:请记住,不要在标签中保留标签a的强引用

听起来这两个对象都不是控制器,通常控制器会执行这种角色。