2013-08-02 24 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 
}]; 

注:請記住,不要抱持着強烈的裁判要標記的標籤

相關問題