在 objective c 中写入块外的变量

Write to variable outside of block in objective c

我无法访问块外的变量(显然)。我似乎无法 return 块中的值。我无法相信使用 class 的属性是这里的最佳实践...

// Return true when failed
- (bool)myMethod:(XCUIElement *)element {
    bool fail = false;
    [self waitWithTimeout:timeout
                  handler:^(NSError *_Nullable error){
                  if (error != nil) {
                    // How do I assign to fail here?
                    fail = true;
                   }
    }
  return fail;
}

我该怎么做?

访问块中的属性没有错,但你必须小心。

默认情况下,块会强烈捕获变量。如果 class 现在持有该块,您将获得一个保留周期。

为了避免这种情况,你可以创建一个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;
    }
}];

如果变量是块的局部变量,则用 __block:

声明它
__block NSString *blockString = @"Blocks are cool";

一般来说,您应该可以在没有 __block 的情况下访问它们,但是如果您想要更改变量的值,则需要它。