Objective C - 单独释放块

时间:2015-05-19 12:54:36

标签: objective-c objective-c-blocks

我有以下虚拟架构:一个将接收一些数据的单例类,并且在某些时候(当调用returnCallback函数时)将使用回调返回数据。

@interface Helper: NSObject
{
    void (^_completionHandler)(int someParameter);
}

+(Helper *)getInstance;

- (void) doSomethingWithCompletionHandler:(void(^)(int))handler;
@end


@implementation Helper

+(Helper *)getInstance {
    static Helper *instance = nil;

    @synchronized(self) {
        if (instance == nil)
            instance = [[self alloc] init];
    }

    return instance;
}

- (void) doSomethingWithCompletionHandler:(void(^)(int))handler
{
    //do things 

    _completionHandler = [handler copy];

    //do things
}

-(void) returnCallback
{
    int result;
    //do things with result
    _completionHandler(result);
    //nothing to follow, it just returned the result.
}

@end

直到现在我一次打电话给帮手,一切正常。 E.g。

[[Helper getInstance] doSomethingWithCompletionHandler:^(int result){
    NSLog(@"I received %d", result);
}];

但是现在我需要调用助手2次,第二次调用第一次助手。 E.g。

[[Helper getInstance] doSomethingWithCompletionHandler:^(int result){
    [[Helper getInstance] doSomethingWithCompletionHandler:^(int result){
        NSLog(@" Yay, I'm good %d", result);
    }];


    NSLog(@"They stopped retaining me:( %d", result);
}];

问题是(如日志中所示)第一个函数回调是从内存释放的,我无法访问结果变量。解决这个问题的方法是保留2个回调变量(一个用当前的变量,一个用旧的变量),但是如果我需要第三个变量呢?我尝试使用块引用构建NSMutableArray。但是我不得不删除它们,而且我也没弄清楚它们是什么。(它们被复制到Helper类中,所以我没有在" Testing&#34中引用该复制的对象。 ;上课,我呢?)

上述代码未经过测试,因为这更像是基于架构的问题。然而,我会测试它并尽快编辑消息,如果有任何错误。

1 个答案:

答案 0 :(得分:2)

由于您设计的方式,您只能有一个活动操作。如果您尝试执行的操作多于当时的操作,则会发生意外情况(如您的示例所示)。

有一种既定的模式来做这样的事情 - 看看NSOperationNSOperationQueue,例如here