我应该在块中使用函数参数,还是将它们保存为__block变量

时间:2016-03-31 12:31:36

标签: ios objective-c block

当我在块中使用实例变量时,最好的做法是在它之前添加__block,因此范围是异步的,我可以在之后使用它。 例如:

-(void) someFunctionWithParam:(NSString *) nameIWillUseInBlock {

    [self functionWithCallback:^(NSString *string) {

        NSString *stringWithString = [NSString stringWithFormat:@"%@%@", nameIWillUseInBlock, @"with bla"];

        //Here Ill do somthing with this string
    }];
}

所以我的问题是,传递给函数的params怎么样,我可以像这样使用它们:

-(void) someFunctionWithParam:(NSString *) nameIWillUseInBlock {

    __block NSString *asyncNameIWillUseInBlock = nameIWillUseInBlock;

    [self functionWithCallback:^(NSString *string) {

        NSString *stringWithString = [NSString stringWithFormat:@"%@%@", asyncNameIWillUseInBlock, @"with bla"];

        //Here Ill do somthing with this string
    }];
}

或者我应该将param保存为__block实例,如下所示:

.md

如果我应该使用params而不是__block实例,那么范围如何知道女巫参数在当前范围之前传递了?

感谢。

2 个答案:

答案 0 :(得分:2)

这是关于Working With Blocks主题的非常好的苹果文档 我认为“块可以从封闭范围中捕获值”这一部分正是您正在寻找的。

“在此示例中,anInteger在块之外声明,但在定义块时捕获该值。

除非您另行指定,否则仅捕获该值。这意味着如果在定义块的时间和调用块的时间之间更改变量的外部值“

所以,如果你看一下:

Integer is: 42

日志将显示

__block int anInteger = 42;

void (^testBlock)(void) = ^{
    NSLog(@"Integer is: %i", anInteger);
};

anInteger = 84;

testBlock();

“使用__block变量共享存储”

Integer is: 84

日志将显示

table.ColumnChanging += OnColumnChanging;

答案 1 :(得分:-1)

你可以直接在块中使用参数,你可以使用这段代码。

-(void) someFunctionWithParam:(NSString *) nameIWillUseInBlock {

[self functionWithCallback:^(NSString *string) {

    NSString *stringWithString = [NSString stringWithFormat:@"%@%@", nameIWillUseInBlock, @"with bla"];

    //Here Ill do somthing with this string
}];

}