我正在使用NSRegularExpression enumerateMatchesInString]。 我传递了一个内联块。
每次找到结果时都会调用该块。我想通过将结果一个接一个地附加到新字符串来创建新字符串。
我无法访问块外的变量(显然)。我无法从块返回值,因为enumerateMatchesInString期望块具有返回类型void。
我无法相信使用课程属性是最好的做法......
我该怎么做?
答案 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
的情况下访问它们,但如果您想要更改变量的值,则需要它。