在 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
的情况下访问它们,但是如果您想要更改变量的值,则需要它。
我无法访问块外的变量(显然)。我似乎无法 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
的情况下访问它们,但是如果您想要更改变量的值,则需要它。