2013-08-02 25 views
1

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

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

2创建一个包装类,它能够在dealloc中运行任意代码并将该对象与标签A关联。当获得dealloc时,关联的对象也会获得dealloc(假设只有A拥有强引用),那么代码被调用。

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

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

+0

听起来好像没有这些对象是控制器,通常一个控制器会执行这种角色。 – Wain

回答

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 
}]; 

注:请记住,不要抱持着强烈的裁判要标记的标签

相关问题