在目标c中写入块外的变量

时间:2015-01-06 21:21:29

标签: objective-c block

我正在使用NSRegularExpression enumerateMatchesInString]。 我传递了一个内联块。

每次找到结果时都会调用该块。我想通过将结果一个接一个地附加到新字符串来创建新字符串。

我无法访问块外的变量(显然)。我无法从块返回值,因为enumerateMatchesInString期望块具有返回类型void。

我无法相信使用课程属性是最好的做法......

我该怎么做?

2 个答案:

答案 0 :(得分:0)

访问块中的属性没有任何问题,但您必须小心。

默认情况下强烈阻止捕获变量。如果类现在持有块,则会获得保留周期。

为避免这种情况,您可以创建一个弱变量self。在块中你创建一个(默认的)强变量来避免,处理块时释放对象self

__weak typeof(self) weakSelf = self;
self.testBlock = ^(NSInteger itemIndex) {
    typeof(self) strongSelf = weakSelf;
    if(strongSelf){
         strongSelf.foo = ....;
    }
};

如果要从周围范围写入变量,请使用__block

__block NSUInteger foundIndex = NSNotFound;

[array enumerateObjectsUsingComparator:^(id obj, NSUInteger idx, *BOOL stop){
    if([obj ....]){
        foundIndex = idx;
        *stop = YES;
    }
}];

答案 1 :(得分:0)

如果变量是块的本地变量,则使用__block声明它:

__block NSString *blockString = @"Blocks are cool";

通常,您应该能够在没有__block的情况下访问它们,但如果您想要更改变量的值,则需要它。