2012-04-27 95 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