2012-04-27 77 views
3

我們如何聲明全局(私有實例變量)來接受其中的塊。我們是否需要綜合它&什麼是它的內存管理含義。保存實例變量中的塊

我有一個塊從第三方方法收到,我想保存在實例變量&在稍後階段使用它。

回答

12

這裏是做了一些工作在後臺後存儲用於完成回調的塊的(ARC-以下)例如:

Worker.h:

@interface Worker : NSObject 
{ 
    void (^completion)(void); 
} 
@property(nonatomic,copy) void (^completion)(void); 
- (void)workInBackground; 
@end 

Worker.m:

@implementation Worker 
@synthesize completion; 

- (void)dealloc 
{ 
    Block_release(completion); 

    [super dealloc]; 
} 

- (void)setCompletion:(void (^)(void))block 
{ 
    if (completion != NULL) 
     Block_release(completion); 

    completion = Block_copy(block); 
} 

- (void)workInBackground 
{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) 
    { 
     // Do work.. 

     dispatch_async(dispatch_get_main_queue(), completion); 
    }); 
} 

@end 
2

請參考Blocks Programming Topics

您可以複製並使用C函數釋放塊:

Block_copy(); 
Block_release(); 

如果您正在使用的Objective-C,你可以發送塊copyretain,和release(和autorelease)消息。

爲避免內存泄漏,您必須始終將Block_copy()Block_release()進行平衡。您必須在垃圾收集環境中將copyretainrelease(或autorelease)相平衡 - 無論如何。

+0

這很好。在同一個控制器類中,我想將接收到的塊保存在一個方法中,以便稍後以另一種方法使用它。我應該怎麼做。我想將塊保存在某個實例變量上,然後再使用它。 – Abhinav 2012-04-27 02:17:55

+0

您不能在ARC環境中使用'retain','release'或'autorelease'。 – Abizern 2012-04-27 02:23:31

+0

請參閱http://stackoverflow.com/questions/8360998/beginsheet-block-alternative-with-arc和http://stackoverflow.com/questions/9701923/arc-bridge-cast-block-copy-block-release if你正在使用ARC。 – Hailei 2012-04-27 02:48:50