1

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

可能的解决方案: 1 子类化并在 dealloc 中调用干净的代码。

2 创建一个能够在dealloc中运行任意代码的包装类,并将这个对象关联到标签A。当A得到dealloc时,关联的对象也得到dealloc(假设只有A持有它的强引用),然后调用代码。

我不喜欢第一个,因为它的侵入性太强了,几乎没有用,需要子类化一些简单的东西。所以我用的是2号。

你有什么意见吗?你怎么做呢?

4

1 回答 1

0

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

@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 持有强引用

于 2013-08-07T08:37:59.463 回答